TCP报文的格式
1.TCP Header(图片来源)
2.
(1)源端口和目的端口
各占2个字节,16比特的端口号加上32比特的IP地址.
(2)序号
占4个字节。序号范围是[0,2^32-1]共2^32(即4294967296)个序号,序号使用mod 2^32运算,每个字节都按顺序编号.
(3)确认号
占4个字节,指出接收端主机希望受到对方的下一报文段的数据的第一个字节的序号.
(4)数据偏移
占4个字节,表示数据开始的地方离TCP报文段的起始处有多远。这实际上就是TCP报文段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。
(5)保留
占6个字节,供今后使用,目前置为0。
(6)紧急URG(URGent)
当URG=1时,表明此报文应尽快传送,而不要按原来的排队顺序来传送。与“紧急指针”字段配合使用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长.
(7) 确认ACK
只有当ACK=1时,确认序号字段才有意义,当ACK=0时,确认号无效,TCP规定,在建立连接后所有传送的报文段都必须ACK置为1
(8)推送PSH(PuSH)
当PSH=1时,表明请求远地TCP将本报文段立即传送给其应用层,而不要等到整个缓存都填满了之后再向上交付。
(9)复位RST(ReSeT)
当RST=1时,表明出现严重差错,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个非法的报文段或拒绝打开一个连接.
(10)同步SYN(SYNchronization)
在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1。因此,SYN=1表示这是一个连接请求或连接接受报文,而ACK的值用来区分是哪一种报文.
(11)终止FIN(FINis,意思是“完”,“终”)
用来释放一个连接,当FIN=1时,表明欲发送的字节串已经发完,并要求释放传输连接
(12)窗口
占2字节,表示报文段发送方的接收窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你能够发送的数据的字节数至多是此窗口的大小。”
通知窗口advertised window:接收端根据其接收能力许诺的窗口值,是来自接收端的流量控制。接收端将通知窗口的值放在TCP报文的首部中,传送给对方。
拥塞窗口congestion window:是发送端根据网络拥塞情况得出的窗口值,是来自发送端的流量控制。
(13)检验和
占2个字节,覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,由发端计算和存储,由收端进行验证。
(14)紧急指针
占2个字节,紧急指针仅在URG=1时,才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),因此,紧急指针指出了紧急数据的末尾在报文段中的位置,当所有紧急数据都处理完时,TCP就会告诉应用程序恢复到正常操作,值得注意的是,即使窗口为0时,也可以发送紧急数据
(15)选项
允许每台主机设定能够接受的最大TCP载荷能力(缺省536字节)