如果对网络工程基础不牢,建议通读《细说OSI七层协议模型及OSI参考模型中的数据封装过程?》
下面就是TCP/IP(Transmission Control Protoco/Internet Protocol )协议头部的格式,是理解其它内容的基础,就关键字段做一些说明
Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接;
Sequence Number:TCP连接中传送的字节流中的每个字节都按顺序编号,用来标识从TCP发送端向TCP收收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题;
Acknowledgment Number:期望收到对方下一个报文的第一个数据字节的序号个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
Offset:它指出TCP报文的数据距离TCP报文段的起始处有多远,给出首部中32 bit字的数目,需要这个值是因为任选字段的长度是可变的。这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节;
TCP Flags:TCP首部中有6个标志比特,它们中的多个可同时被设置为1,主要是用于操控TCP的状态机的,依次为URG,ACK,PSH,RST,FIN。每个标志位的意思如下:
SYN (Synchronize Sequence Numbers)-同步序列编号-同步标签
The segment is a request to synchronize sequence numbers and establish a connection. The sequence number field contains the sender's initial sequence number.
该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
ACK (Acknowledgement Number)-确认编号-确认标志
The segment carries an acknowledgement and the value of the acknowledgement number field is valid and contains the next sequence number that is expected from the receiver.
大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
网络上有很多错误说法,比如:ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。其实:ACK&SYN是标志位,
FIN (Finish)-结束标志
The sender wants to close the connection
用来释放一个连接。
当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
URG (The urgent pointer)-紧急标志
Segment is urgent and the urgent pointer field carries valid information.
当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据
PSH (Push)-推标志
The data in this segment should be immediately pushed to the application layer on arrival.
PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH=1表示有真正的TCP数据包内容被传递。
RST (Reset)-复位标志
There was some problem and the sender wants to abort the connection.
当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接