网络层解决了计算机到计算机之间的通信问题,传输层协议通过加入端口号,来实现每台机器上的不同进程之间的通信。
TCP 的可靠数据传输服务确保数据在传输中是完整且按序的
需要解决的问题
TCP协议面向字节流,为每个字节都编上序号。在发送时多个字节组成报文段发送。
序号seq字段 指的是一个报文段第一个子节的序号
确认号ack字段 指的是希望收到的下一个报文段的第一个字节的序号
TCP提供全双工通信:
- 发送缓存: 准备发送的数据&已经发送但没有收到确认的数据
- 接受缓存:按序到达但没有被应用程序读取的数据 & 没有按需到达的数据
TCP默认使用累计确认
只会返回应该按序接受的报文段第一个字节的序号
累计确认可以让我们同时对多个接受的报文进行一次确认
超时+重传
发送方发送一个未被确认的数据包后就启动一个计时器,如果在指定时间内没有收到ACK, 发送方可以重传该报文
存在问题:等待时间太长
每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
TCP发送方一次性可以发送多个报文段,接收方使用累计确认
流量控制:让发送方慢点,要让接收方来得及接受
TCP利用滑动窗口机制实现流量控制
控制方:接收方
被控制方:发送方
原理
在通信过程中,接收方根据自己接受缓存的大小,通过设置确认报文段的窗口字段来将rwnd(接受窗口)通知给发送方,发送方的发送窗口取接受窗口rwnd和拥塞窗口cwnd的最小值。
拥塞控制的目的:防止过多的数据注入到网络中,全局性。
四种算法
假定
1.数据单方向传送,而另一个方向只传送确认
2.接收方总是有足够大的缓存空间,发送窗口 = Min(接收窗口rwnd,拥塞窗口cwnd),所以发送窗口的大小取决于拥塞程度
一个传输轮次:发送一批报文段并收到他们的确认时间 = 一个往返时延RTT
1.先试探网络情况,拥塞窗口/发送窗口指数增加。
2.到了初始的阈值后,发现网络有点堵,为了避免拥塞,拥塞窗口/发送窗口加法增加。
3.出现丢包现象,发现网络堵塞,新阈值 = 当前的拥塞窗口值/2,然后将当前的拥塞窗口值改为初始值1,重复步骤1、2
假定
1.数据单方向传送,而另一个方向只传送确认
2.接收方总是有足够大的缓存空间,发送窗口 = Min(接收窗口rwnd,拥塞窗口cwnd),所以发送窗口的大小取决于拥塞程度
快重传:收到3个重复的确认执行快重传算法
快恢复:在步骤3,将当前窗口值改成新阈值,然后直接加法增大
这个问题是我在面经上看见的,很少考,感觉能说上几句就行了
UDP本身是无法确保数据的可靠传输的,所以不能在传输层进行改进。
实现的方式可以参考HTTP3的QUIC(快速UDP互联网连接)协议,该协议在 UDP 的基础之上增加了一层来保证数据可靠性传输,它提供了数据包重传、拥塞控制以及其他一些 TCP 中存在的特性。
区别 | TCP | UDP |
---|---|---|
首部开销 | 20B | 8B |
传输 | TCP协议面向字节流,为每个字节都编上序号。 在发送时多个子节组成报文段发送。 | 面向报文,不对报文拆分,加入UDP首部直接传输 |
连接 | 面向连接 | 无连接 |
是否可靠传输 | 是,提供流量控制和拥塞控制 | 否,不使用流量控制和拥塞控制 |
速度 | 慢 | 快 |
通信双方 | 单播传输 | 可以单播,多播,广播 |
使用场景 | 适合于要求可靠传输的应用,比如文件传输 | 适用于实时应用,比如IP电话、视频会议等 |
UDP与TCP的首部格式
UDP的首部格式
TCP的首部格式
紧急位URG:URG=1,标明此报文段中有紧急数据,是高优先级的数据,应该尽快传送,不用在缓存里排队,配合紧急指针字段使用。
确认位ACK:ACK=1时确认号有效,在连接建立后所有的传输的报文段都必须把ACK置为1
同步位SYN:SYN=1时,表明是一个连接请求/请求接受报文
终止位FIN:FIN=1时表明此报文段发送方数据已发送完,要求释放连接。