Transmission Control Protocol TCP 传输控制协议解析
数据在网络中传输,底层并不能保证其稳定性。也就是数据是否到达,到达的顺序是否一直,这些都是无法保证的。TCP就是在底层IP协议的基础上,人为的增加了一种规定,用来保证数据的准确性。就是所有的入网设备,大家都按照我这个规定:发送数据的时候增加一个编号,对方收到数据返回一个通知。数据到达后根据编号进行排序,如果规定时间内还没有收到对应数据,则发送消息让对方重发。
TCP由底层操作系统等实现,我们不需要关心只需要使用即可。
协议头
|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
| Source port | Destination port |
| Sequence number |
| Acknowledgment(ACK) number |
|Data offset| Reserved |C |E |U |A |P |R |S |F | Window Size |
| Checksum | Urgent pointer |
| Options(if Data offset > 5) |
| Data |
TCP协议头与IP的比较相似
Source port 源端口 16bits
发送方端口
Destination port 目的端口 16bits
接收方端口
Sequence number 序列号 32bits
发送方数据编号
Acknowledgment(ACK) number 确认序列号 32bits
告知发送方,数据接收到哪里
Data offset head长度 4bits
表示有几个32bits的数据,与IP协议类似,表示协议头的长度,记住不是数据长度。
Reserved 保留 4bits
保留字段,赋值为0,不予处理。也有说保留字段是6bits,那么后面紧跟的标识字段就会少2个。
标志位 8bits
-
CWR(Congestion Window Reduce) 拥塞窗口减少标志,发送端通过降低发送窗口的大小来降低发送速率
-
ECE(ECN Echo) ECN响应标志
-
URG(Urgent) 表示紧急点标识(Urgent pointer)标志有效
-
ACK(Acknowledgment) 表示Acknowledgment Number字段是否有效
-
PSH(Push) 要求将缓冲数据推送到接收应用程序
-
RST(Reset) 复位TCP连接
-
SYN(Synchronize) 同步序列编号(Synchronize Sequence Numbers)有效
-
FIN(Finish) 结束TCP会话
AE Accurate ECN
后来又增加了一位标志AE,由于后续没有位置了,就在标志位前面用掉一位,Reserved就少了一位,变成3bits
Windows size 窗口大小 16bits
发送方的接收窗口大小,便于接收方回传数据时判断可以最多发送多少数据。
Checksum CRC校验码 16bits
Urgent pointer 紧急指针 16bits
表示哪些是紧急数据
Options 可选项
数据必须填充为32bits的倍数,常见的一些扩充。
- Kind-扩充字段的类型,数字编号,1个字节,也就是0-255种类型
- Length-扩充字段的长度
- Meaning-扩充字段的解释
- Reference-对应的标准
Kind | Length | Meaning | Reference |
---|---|---|---|
0 | - | End of Option List | [RFC793] |
1 | - | No-Operation | [RFC793] |
2 | 4 | Maximum Segment Lifetime | [RFC793] |
3 | 3 | WSOPT - Window Scale | [RFC1323] |
4 | 2 | SACK Permitted | [RFC1072] |
5 | N | SACK | [RFC1072] |
6 | 6 | Echo (obsoleted by option 8) | [RFC1072] |
7 | 6 | Echo Reply (obsoleted by option 8) | [RFC1072] |
8 | 10 | TSOPT - Time Stamp Option | [RFC1323] |
9 | 2 | Partial Order Connection Permitted | [RFC1693] |
10 | 5 | Partial Order Service Profile | [RFC1693] |
11 | CC | [Braden] | |
12 | CC.NEW | [Braden] | |
13 | CC.ECHO | [Braden] | |
14 | 3 | TCP Alternate Checksum Request | [RFC1146] |
15 | N | TCP Alternate Checksum Data | [RFC1146] |
16 | Skeeter | [Knowles] | |
17 | Bubba | [Knowles] | |
18 | 3 | Trailer Checksum Option | [Subbu & Monroe] |
WSOPT Window Scale
这个可选项是为了扩充Windows size窗口字段的。因为一开始预留的窗口大小不满足后续的需求,如果窗口大于预留的最大值时,无法正确表示,所以增加了一个option,在三次握手的时候,把自己的扩充字段增加进去,扩充的规则是把Window size的字段数据乘以扩充字段数据的二的多少次方。也就是如果Window size是100,Window Scale是3,那么窗口大小就是100*2^3。
https://www.rfc-editor.org/rfc/rfc793.html
https://www.rfc-editor.org/rfc/rfc3540.html
https://www.rfc-editor.org/rfc/rfc3540.html
https://www.rfc-editor.org/rfc/rfc6679
https://www.rfc-editor.org/rfc/rfc8311.html
https://datatracker.ietf.org/doc/draft-ietf-tcpm-accurate-ecn/
https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml
https://www.rfc-editor.org/rfc/rfc1700.html