1、TCP是什么
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
2、TCP协议头
3、各字段含义
- TCP源端口(Source Port):16位的源端口,表示发送方应用程序的端口。源端口和源IP地址标示报文发送端的地址。
- TCP目的端口(Destination port):16位的目的端口,指明报文接收应用程序的端口。
- TCP***(序列码SN,Sequence Number):32位的***标识了TCP报文中第一个byte在对应方向的传输中对应的字节序号。
- TCP应答号(Acknowledgment Number简称ACK Number或简称为ACK Field):32位的ACK Number标识了报文发送端期望接收的字节序列。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
- TCP报文头长度(Header Length):4位,指示TCP头的长度,即数据从何处开始。最大为15,单位是32比特(32-bit word),也就是4个字节,也就是说TCP报文头最大长度为60个字节。注意,这个不是TCP报文的长度,TCP是流协议,不需要说明报文长度,IP协议里有IP数据报的长度。
- 保留(Reserved):6位值域。为了将来定义新的用途所保留。
- 标志(Code Bits):6位标志位,下面介绍。
- 窗口大小(Window Size):16位,该值指示了从Ack Number开始还愿意接收多少byte的数据量,也即用来表示当前接收端的接收窗还有多少剩余空间。用于TCP的流量控制。在TCP协议的可选项里,还可以定义窗口的比例因子,因此实际的窗口大小需要乘上比例因子。
- 校验和(Checksum):16位。发送端基于数据内容计算一个数值,接收端要与发送端数值结果完全一样,才能证明数据的有效性。接收端checksum校验失败的时候会直接丢掉这个数据包。
- 紧急指针(Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
- 选项(Option):长度不定,但长度必须以是32bits的整数倍。常见的选项包括MSS、SACK、Timestamp等等。
4、关于标志位的说明
-
URG(Urgent):该标志位置位表示紧急(The urgent pointer) 标志有效。该标志位目前已经很少使用参考后面流量控制和窗口管理部分的介绍。
-
ACK(Acknowledgment):取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。后续文章介绍中当ACK标志位有效的时候我们称呼这个包为ACK包,使用大写的ACK称呼。
-
PSH(Push):该标志置位时,一般是表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
-
RST(Reset):用于复位相应的TCP连接。通常在发生异常或者错误的时候会触发复位TCP连接。
-
SYN(Synchronize):同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。类似的后续文章介绍中当这个SYN标志位有效的时候我们称呼这个包为SYN包。
-
FIN(Finish):带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。
5、TCP抓包示例
-
SYN包
-
数据包
-
ACK包
-
FIN/ACK包