目录
12.1 引言
12.1.1 ARQ和重传
12.1.2 滑动窗口
12.1.3 变量窗口:流量控制和拥塞控制
12.1.4 设置重传的超时值
12.2 TCP的引入
12.2.1 TCP服务模型
12.2.2 TCP可靠性
12.3 TCP头部和封装
12.4 总结
12.1 引言
关于TCP详细内容,原书有5个章节,本章是初步介绍。
IP和UDP没有差错纠正功能。
差错校正码:添加冗余比特,以恢复真实信息。
12.1.1 ARQ和重传
ARQ:自动重传请求协议,许多通信协议使用,如TCP。
即超时没收到ACK的话,重传数据。
序列号(Sequence Number):
TCP头中字段,对TCP数据流中的每个字节进行编号。
作用:
按顺序重组数据。
数据丢失或重复检测。
流量控制。
拥塞控制。
12.1.2 滑动窗口
滑动窗口分为:
接收窗口
发送窗口
接收方根据缓冲空间设置合适接收窗口大小,并将窗口值通知给发送方。
发送方根据接收方的接收窗口大小调整发送窗口大小,控制发送速率,避免接收方缓存溢出。
一个发送窗口包括:
已发送并收到确认的报文。(此时可释放本地报文副本)
已发送但未收到确认的报文。
尚未发送。
12.1.3 变量窗口:流量控制和拥塞控制
流量控制方式:
1. 基于速率
方法:给发送方指定最大发送速率。
使用场景:流应用程序,广播,组播。
2. 基于窗口
窗口大小随时变动。
接收方通过TCP窗口通告/窗口更新向发送方告知的发送窗口大小。
窗口更新和ACK可由同一报文携带。
12.1.4 设置重传的超时值
RTO:重传超时(Retransmission Timeout)
RTT:往返时间(Round-Trip Time)
RTO值通常通过一组RTT以及估计偏差来计算。
RTO略大于RTT均值。
12.2 TCP的引入
12.2.1 TCP服务模型
TCP是面向连接的,字节流。
字节流的意思:
封包不是一个一个独立的。
通信两端的所有数据都按字节编号,可看成一个流。
因为无消息边界,导致粘包,所以需要应用程序自己添加记录标志,用于从完整数据中分离一小段独立数据。
12.2.2 TCP可靠性
TCP序列号:
表示当前分组的第一个字节在整个数据流的偏移。
对UDP,应用程序每次write/send就产生一个UDP数据
而TCP不会,write/send数据会被分段或合并成一个或多个TCP段。
TCP丢弃无效校验和报文
TCP不会为每个报文段设置一个重传计时器。而是一个发送窗口的数据只设置一个计时器。
ACK延迟累积发送:
接收方不会立即对每个接收的数据发送确认,而是等一定时间,将所有ACK合并成一个ACK发送。
12.3 TCP头部和封装
报文格式:
源端口:
目的端口:
序列号:
本次传输数据在整个数据流中位置,用字节表示。初始的序列号是随机数。
确认号:
表示期望接收的下一个包的序列号,之前的数据已确认收到。
头部长度:
TCP头长度。头最长60字节,默认是最小的20字节
标志位:
CWR:
拥塞窗口减小,告知发送方降低它的发送速率。
ECE:
ECN回显,向指示对方网络拥塞。
URG:
是否包含紧急数据,如有,紧急指针字段有效,使用少。
ACK:
确认号字段是否有效。
PSH:
暗示接收方应尽快将数据传给应用程序。
RST:
重置连接(常因为错误)
SYN:
用于发起TCP连接。
FIN:
用于关闭连接。
窗口大小:
向对方通告自己的接收窗口大小。
TCP校验和:
对整个TCP报文段的校验,包括TCP头和数据。
紧急指针:
URG标志为1时,代表一个偏移量,该偏移处有紧急数据。
选项:
提供额外配置信息。
常见选项:
时间戳:
MSS:表示希望接收的报文段最大值。三次握手时通过该值。
SACK:向发送方指示哪些段已成功接收,发送方只重传丢失部分,而不是整个段。
窗口缩放:包含一个缩放因子,按比例放大窗口值,以适应高速网络。
数据字段:
可选。不带数据字段的报文:
SYN,FIN,纯ACK,RST等
可在数据报文中顺带ACK,也可只发ACK不带数据。