1 网络分层协议栈
记录自己研究网络协议的一些过程。
网络可以按4层分,由下往上分别为:
- L2:数据链路层,常见协议为ethernet
- L3:网络层,常见协议为IPv4/IPv6
- L4:传输层,常见协议为TCP/UDP/SCTP
- L5:应用层,常见协议为DNS/HTTP/TLS/SSL
4层网络视图如下:
L5 |
---|
L4 |
L3 |
L2 |
2 TCP协议
2.1 TCP协议的识别
TCP协议一般承载于网络层即L3,比如IPv4/IPv6。
TCP协议,对应IPv4.proto/IPv6.proto为6。
4层网络视图如下:
L5 |
---|
L4:TCP |
L3:IP.proto=6 |
L2 |
##2.2 TCP协议文档
TCP协议文档,参考:
- TCP协议说明文档 https://www.ietf.org/rfc/rfc793.txt
- ECN网络拥塞补充 https://www.ietf.org/rfc/rfc3168.txt
2.3 TCP报文格式
TCP报文一般分为TCP头与TCP数据。
TCP头用于实现TCP协议承诺的功能;按bit顺序说明各头部域:
- 源端口:16bit
- 目的端口:16bit
- 序列号:32bit
- 非syn置位,说明当前tcp包第一字节数据的序列号;
- syn置位,说明初始序列号即ISN,当前tcp包第一字节数据的序列号为ISN+1
- 确认号:32bit
- ack置位,说明发送者期望收到的下一个序列号
- TCP通信建立后,头部数据总是携带确认号
- 数据偏移:4bit
- 一般为TCP头的全长,含后续的options部分
- 计算时,要乘以4获得正确数据
- 如数据偏移为0101,那么TCP头全长为b’0101’*4=20
- 保留位:6bit
- 控制位:6bit
- 从左到右依次为:
- URG: Urgent Pointer field significant
- ACK: Acknowledgment field significant
- PSH: Push Function
- RST: Reset the connection
- SYN: Synchronize sequence numbers
- FIN: No more data from sender
- 从左到右依次为:
- 滑动窗口:16bit
- checksum:16bit
- 用于保证TCP报文(TCP头与TCP数据)的完整性
- 计算时,先将checksum域置0,然后按16bit为单位计算TCP报文的TCP头与TCP数据
- urgent指针:16bit
- 仅再URG置位时,有效;
- 从当前包的序列号开始偏移,指向urgent数据
- options:可变
- 为8bit的倍数
- 支持3种类型options
- End of Option List:8bit,b’00000000’
- No-Operation:8bit,b’00000001’
- Maximum Segment Size:32bit,最后16bit说明最大段长度即MSS
- padding:可变,保证TCP头数据为32bit的倍数,全0
TCP数据即为传输的应用数据,数据可以为0即不携带。如3次握手/4次挥手。
TCP报文格式如下:
2.4 TCP交互流程
TCP协议通过建立TCP连接,来完成TCP通信。
TCP通信,大概分为3个阶段:
- 建立连接阶段
- 涉及通信双方,进行3次握手
- syn/syn-ack/ack
- 通信双方的状态,经过syn-sent/syn-recived/estab的变化
- 涉及初始序列号的设定即ISN
- 连接建立后通信阶段
- 通信双方,可以进行双向收发通信
- 分别通过序列号/确认号,完成通信的可靠性:超时重传等
- 通过滑动窗口,调节通信速率,避免拥塞
- 结束连接阶段
- 涉及通信双方,进行4次挥手
- 通信双方的状态,经过fin-wait-1/fin-wait-2/time-wait/closing/close的变化
- 超时机制,保证通信最终能进入close状态
TCP通信交互流程如下:
2.5 TCP状态机
2.6 参考报文
https://wiki.wireshark.org/uploads/__moin_import__/attachments/SampleCaptures/200722_tcp_anon.pcapng