初识计算机网络
为什么要有计算机网络这个东西呢?
其实说白了就是为了提高效率
比如说,你在北京,要给一个西藏的客户送快递,那你总不能自己定个机票再手动给他送吧,又不是只有他一个单子需要派送,是向全国各地派送,所以就需要各地都有驿站收发快递
OSI体系结构
把结构分成七层(但是比较滞后,跟不上时代了)
还有一种事实上的国际标准:
为什么会存在这样的差别呢?
很正常啊
你法律意义上有个老婆,你出轨了
这个TCP/IP在实际的原理体系结构中,网络接口层里面还包含两层
每一个模块具体做了什么如下图所示:
在数据链路层会添加帧头和帧尾,在物理层会添加比特流
HTTP
应用层:解决通过应用进程的交互来实现特定网络应用的问题
在浏览器地址栏输入某个网站的域名后就可以访问该网站的内容,这就是万维网www应用,相关的应用层协议是超文本传输协议HTTP
传输就是http是双向的,超文本就是不只是文本
HTTP请求相应过程
HTTP最突出的特点是简单灵活易于扩展,应用广泛,跨平台
也分持久性和非持久性链接
HTTP报文格式
TCP
传输层比较重要的就是TCP和UDP
物理层数据链路层和网络层解决的是主机与主机间的通信
但是实际通信的是两个主机间的进程
这两个进程之间的通信的协议就是UDP或者TCP了
TCP是面向连接的,可靠的,基于字节流的传输层通信协议
而UDP不需要保证可靠所以相对就简洁一点
二者区别:
TCP三次握手建立连接
三次握手才可以阻止历史重复连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费
TCP四次挥手断开连接
关闭连接时,客户端向服务端发送FIN时,仅仅表示客户端不再发送数据了,但是还可以接收数据
服务器收到客户端的FIN报文时,先回一个ACK应答报文,服务端可能还有数据需要数据处理和发送,等服务端不再发送数据时,才发送FIN报文给客户端表示同意现在关闭连接
TCP可靠传输之流量控制
TCP是一个可靠传输的协议,那么怎么保证可靠呢?
保证数据可靠需要解决数据的破坏、丢包、重复、分片顺序混乱等问题,如果不解决这些问题,就无从谈起可靠性传输
TCP是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的
主要是重传机制、滑动窗口、流量控制、拥塞控制
流量控制是TCP提供的一种可以让发送方根据接收方的实际接收能力控制发送的数据量
TCP通过接收窗口变量来提供流量控制
接收窗口会给发送方一个指示(还有多少可用的缓存空间),发送端会根据接收端的实际接收能力来控制发送的数据量
TCP之拥塞控制
当网络拥堵时,如果发送大量 的数据包,可能会导致数据包时延,丢失等,这个时候TCP就会重传数据,但是重传又会导致网络的负担更重,就会造成更大的延迟和更多的丢包。。。
于是就有了拥塞控制,控制的目的是避免发送方的数据填满整个网络
为了在发送方调节所要发送的数据的量,定义了一个叫做拥塞窗口的概念
拥塞窗口cwnd是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化
只要网络中没有出现拥塞,cwnd就会增大
当网络中出现了拥塞,cwnd就会减少
只要发送方没有在规定时间内接收到ACK应答报文,发生了超时重传,就会认为网络中出现了拥塞
TCP之重传机制
重传机制有超时重传,快速重传和SACK方法
三者对比
机制 | 核心逻辑 | 重传触发条件 | 优势 | 局限性 |
---|---|---|---|---|
超时重传 | 依赖超时计时器 | 超时未收到 ACK | 逻辑简单 | 重传延迟高,无法处理连续丢包 |
快速重传 | 依赖重复 ACK | 收到 3 个重复 ACK | 减少重传延迟 | 仅能处理首个丢失的数据包 |
SACK | 携带已接收数据块范围 | 结合重复 ACK 和 SACK 信息 | 精准重传非连续丢包 | 增加报文开销,实现复杂 |