TCP/IP协议

310 阅读2分钟

TCP协议

1.1、TCP协议的报文结构

源端口号,目标端口号
  • TCP 的报文里没有 源IP和 目的IP,因为那是IP层协议的事情,TCP层只有源端口和目的端口。
  • 源IP,源端口,目的IP,目的端口构成了 TCP 连接的 “四元组”。一个四元组可以标识一个连接。
序列号(Sequence number)

TCP 是面向字节流的协议,通过TCP传输的字节流的每个字节都会分配序列号,序列号值得是本报文段第一个字节的序列号。序列号加上报文长度,用于确定传输的是哪一段数据。序列号是一个 32 位的无符号整数,达到 2^32-1 后循环到 0。在 SYN 报文中,序列号用于交换彼此的初识序列号,在其他报文中,序列号用于保证包的顺序。如果发送方发送的是四个报文段的序列号分别是: 1、2、3、4,但是到达接受方的顺序是 2、4、3、1,接受方可以通过序列号的大小顺序组装出原始的数据。

确认号(Acknowledgment number)

TCP 使用确认号来告知对方下一个期望接受的序列号,小于此确认号的所有字节都已经收到。

数据偏移

占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=1532位=154字节。

Flags

我们通常所说的 SYN、ACK、FIN、RST 其实只是把 flags 对应的 bit 位置为 1 而已,这些标记可以组合使用,比如 SYN+ACK,FIN+ACK 等。

  • SYN(Synchronize): 用于发起连接数据包同步双方的初始化序列号。
  • ACK(Acknowledge):确认数据。RST(Reset):这个标记用来强制断开连接。
  • FIN(Finish): 通知对方数据发送完毕,准备断开连接。
  • PSH(Push):告知对方这些数据包收到之后马上交给应用层,不能缓存。