ICMP
8位类型 | 8位代码 | 16位校验和 | 报文内容 |
---|
(1)差错报文,回应网络错误
目标不可到达(类型为 3)
重定向(类型为 5)
(2)查询报文,查询网络信息
一、TCP
(1)TCP 头部大小必须以 4 字节的倍数
选项最多为 40 字节;
最常见的选项是”最大段大小“(MSS),一般在第一个报文段上指定这个选项。表示该发送方可以接收的报文段的最大值;
消耗序列号意味着使用重传进行可靠传输;
SYN 占用 ISN 序列号;
(2)选择确认和选择重发
已经接收到了1 ~ 1024字节,下一个数据包为 2049 ~ 3072,那么接收方无法通过 ACK 告诉发送方接收到这个数据包
现代 TCP 还有一个 SACK 选项,可以告诉发送方正确接收到了乱序到达的数据;
(3)流量控制
接收窗口:处理 发送方和接收方 速率问题;
拥塞控制:处理 中间网络(路由器等) 速率问题;
1. TCP连接管理
三次握手的目的:交互初始序列号(ISN),利用数据包的选项承载特殊信息;
1.1 TCP半关闭
调用 shutdown()
函数而非 close()
应用层判断对方是否已经关闭连接的方法为:read
系统调用返回 0(收到 FIN 报文段);
1.2 同时打开与关闭
很少发生,一个同时打开过程需要交换 4 个报文段;
1.3 初始序列号
ISN 会随时间而改变,可被视为一个 32 位计数器,每 4 微妙加 1;
现代系统中对每一个连接设置随机的偏移量;
1.4 连接建立超时
net.ipv4.tcp_syn_retries
表示一次主动连接申请中尝试重新发送 SYN 报文段的最大次数;
net.ipv4.tcp_synack_retries
表示相应对方的一个主动连接请求时尝试重新发送 SYN + ACK 报文段的最大次数;
1.5 TCP选项
选项总长度包括了种类和 len 个字节,种类主要来确定字节数 len;
(1)MSS,kind=2;只记录 TCP 数据的字节数,不包括头部;默认数值为 536 字节,典型值为 1460;
(2)允许选择确认,kind=4;只有 SYN (SYN + ACK)报文段才能包含;
(3)SACK,kind=5;任何报文段都可以包含,一个 SACK 块由一对 32 位序列号表示
(4)窗口缩放,kind=3;选项中使用一个 16 位数值的比例因子,表示将窗口字段值左移 0 ~ 14 位;只能出现在 SYN 报文段中,且通信双方都需要在 SYN 中包含该选项;
主动连接的一方发送了一个非 0 的比例因子但没有收到对方的窗口缩放选项,会将自己发送与接收的比例因子都设为 0;
根据接收缓存大小自动选取;
(5)时间戳(TSopt),kind=8;要求发送方在每个报文段中添加 2 个 4 字节的时间戳数值;
发送方填写 TSval,接收方填写 TSecr;
-
估算 TCP 连接的往返时间,设置重传超时
-
这些时间戳也可作为 防回绕序列号(PAWS);提供了避免接收就报文段与判断报文正确性的方法;
-
在高速网络中,32 位序列号很容易使用完然后又从 0 开始,假设前面第一个 32 位序列号范围内的某个报文段丢失重传,但第二个 32 位序列号范围内的已经开始传输,接收方可能就无法区分接收到的报文段是属于重传的还是第二个范围内的,此时通过发送时间戳可以进行区分,因此接收者可以将时间戳看作一个 32 位的扩展序列号;
-
需要保证时间戳数值单调增长,并且每一个窗口的数据都至少增加 1;
-
1.6 TCP状态
(1)TIME_WAIT,也称为 2MSL 等待状态
1.7 RST 报文段
(1)针对不存在端口的连接请求或端口处于 TIME_WAIT 状态时
(2)终止一条连接,如用户按下 crtl-c
(3)半开连接;服务器断电重启,客户端向其发送数据时,服务器回应 RST 报文段;
(4)时间等待错误;客户端在 TIME_WAIT 状态时,收到服务器之前发送的报文段,发送一个 ACK 报文段,然而服务器已经关闭,只能返回一个 RST 报文段,这会导致过早地从 TIME_WAIT 状态转移至 CLOSED 状态;
2. TCP超时与重传
基于时间
基于确定信息的构成
每个 TCP 连接的 RTT 均独立计算;
参考
《TCP/IP详解 卷1》