在现代计算机网络中,TCP(Transmission Control Protocol)是一种常用的传输层协议。它提供了可靠的数据传输机制,确保数据的完整性和有序性。
TCP报文
tcp的报文大概长这样子:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
| (variable length, optional) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
它主要由两部分组成,也就是首部和数据部分
我们主要介绍下首部的组成:
- 源端口号(Source Port)和目标端口号(Destination port):分别代表tcp报文发生者的主机端口,以及接收方的主机端口号,分别占16位,也就是2字节。
- 序列号(Sequence Number):4字节,从0-(2^32)-1,用于指示当前报文位于整个报文的第几个字节,比如当序列号是401的时候,就表示前面已经接收了400个字节的数据了,当前的报文的数据第一个字节在整个需要传输的数据中属于第401个字节,所以它也叫“报文段序号”。
- 确认号(Acknowledgment Number):4字节。表示期望收到对方下一个报文段的第一个数据字节的序号。比如B已经收到了A发过来的序列号是401,长度是100的数据了,那么B发给A的确认报文中的确认号就应该是501,表示下一次A发送过来的报文序列号应该是501。
- 数据偏移(Data Offset):4位(半个字节),用于表示首部的长度,也可以表示数据部分距离TCP报文起始处的位置。因为4位能表示的最大10进制数是15,所以数据偏移的最大值是60字节,除去首部的选项以外的字段占20字节,所有选项最大能占40字节。另外,需要注意TCP报文每一行有4个字节,所以15*4=60.
- 保留(Reserved):占6位,保留为今后使用。目前就是默认的0
- 紧急URG:1位,当URG为1时,紧急指针字段(指示紧急数据的长度)有效,其作用是告诉系统此报文段有紧急数据,应该尽快传送,而不是按原来的排队顺序传送。相当于紧急控制位激活的报文优先传输,不排队,直接插队。
- 确认ACK:ACK=1时,确认号才有效。建立连接后,ACK应该置为1.
- 推送PSH: 发送方一般可能会等缓存满了再发数据,但是如果接收方希望立刻得到对方相应,就可以立刻发送一个报文,并将PSH置1,对方就会立刻将目前已经缓存的数据发送过来,而不会继续等待装载数据。
- 复位RST:RST如果为1,表示TCP链接中出现了严重差错,必须关闭连接,重新建立连接。同时RST有时也用于拒绝一个非法报文或拒绝打开一个连接。
- 终止FIN,FIN置1,用来释放一个连接。
- 窗口(Window):2字节,用于告诉接收方,放松这段报文的发送方的窗口大小,也就是还能够接收多少数据,这个数据指的是数据部分,不包括首部。
- 检验和(Checksum)2字节,用于检验首部和数据部分,主要作用是在首部之前添加12字节的伪首部。从而检验数据在传输过程中是否发生了损坏。
- 紧急指针(Urgent Pointer):2字节,在URG为1时有效,指示数据部分紧急数据的字节数,紧急数据之后就是普通数据。
- 选项(Options) 长度可变,最长可达40字节,没有选项时,TCP首部占20字节。选项主要用于扩展一些功能,比如最大报文段长度和时间戳选项,用于满足一些特殊的业务需求。