tcp协议报文格式详解
TCP协议
TCP协议的报文格式(也是封装在IP数据报里的)
TCP首部介绍:
TCP字段 | 功能 |
---|---|
源端口号 | 表示发送端端口号,字段长度16位 |
目标端口号 | 表示接收端端口号,字段长度16位 |
序号 | 序列号是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。字段长度32位 |
确认号 | 是指期望下一次应该收到的数据的序列号。发送端接收到这个确认应答号以后就可以认为在这个序号以前的数据都已经被正常接收了。字长32位 |
首部长度 | 指出TCP报文首部含选项时的长度,没有选项时为5,字长4位 |
保留 | 该字段主要为以后扩展使用。一般设置为0. |
URG | 为1时,表示包中有需要紧急处理的数据。 |
ACK | 为为1时,确认应答的字段变为有效。TCP规定除了在最初建立连接时候的SYN包之外该位必须设置为1 |
PSH | 该位为1时,表示需要将收到的数据立刻上传给上层应用协议。PSH为0时,则不需要立即传,而是先进行缓存。 |
RST | 该位为1时,表示TCP连接出现异常,必须强制断开连接。 |
SYN | 用于建立连接。SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。 |
FIN | 该位为1时,表示今后都不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。(每个主机又对对方的FIN包进行确认应答以后就可以断开连接了。不过主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据都因已成功发送而被自动删除之后再发。) |
窗口 | 用来让对方设置发送窗口的依据(告诉对方自己能接受多少数据),2字节 |
检验和 | 检验和字段检验的范围包括首部和数据这两个部分。在计算检验和是,要在TCP报文段的前面加上12字节的伪首部 |
紧急指针 | 指出在本报文段紧急数据共多少个字节(紧急数据放在本报文段数据最前面) |
TCP三次握手
- 第一次
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize
Sequence Numbers)。 - 第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 - 第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。