TCP头部解析





一一解析


SourcePort(源端口)DestinationPort(目的端口):各占2个字节,端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口才能实现。 

   TCP的包是没有IP地址的,那是IP层上的事。但是有源端口和目标端口。
SequenceNumber
(序号):占4个字节,TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
AcknowledgmentNumber
(确认号):占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
DataOffset
(数据偏移(即首部长度)):占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位字,即以4字节为计算单位。 
Reserved(
保留字段):6位,保留为今后使用,但目前应置为0
TCPFlag(
标志位):6位,分别表示6个标志:紧急URG确认ACK推送PSH(PuSH)复位RST(ReSeT)同步SYN终止FIN(FINis)
URG——
URG= 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
ACK——
ACK= 1 时确认号字段有效,ACK= 0 时,确认号无效。
PSH(PuSH) ——
接收TCP收到PSH= 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
RST(ReSeT)——
RST= 1 时,表明TCP连接需要释放连接,然后再重新建立运输连接。
SYN——
同步SYN= 1 表示这是一个连接请求或连接接受报文。
FIN(FINis) ——
用来释放一个连接。FIN= 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

注:

URG(紧急位):急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)
PSH
(急迫位):在一个交互程序中,当客户发送一个命令给服务器时,它设置PU S H标志并停下来等待服务器的响应。通过允许客户应用程序通知其TC P设置PU S H标志,客户进程通知TC P在向服务器发送一个报文段时不要因等待额外数据而使已提交数据在缓存中滞留。类似地,当服务器的TC P接收到一个设置了PU S H标志的报文段时,它需要立即将这些数据(包括以前存中滞留的数据)递交给服务器进程而不能等待判断是否还会有额外的数据到达。PSH=1,只对接收方的接收缓冲区起作用,发送方通过使用PUSH位来通知接收方将所有收到的数据立即提交给服务器进程,而不需要等待额外数据(将缓存填满)而让数据在缓存中停留!这里所说的数据包括与此PUSH包一起传输的数据以及之前就为该进程传输过来的数据(滞留在缓存中的数据)。


Window(窗口字段):占2字节,用来让对方设置发送窗口的依据,单位为字节。表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
Checksum
(检验和):占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
UrgentPointers
(紧急指针字段):占16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
options
(选项字段):长度可变。TCP最初只规定了一种选项,即最大报文段长度MSSMSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”在TCPMSS选项中,MSS值是一个16位的字段,最大值为65535
其他选项:窗口扩大选项——占 3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数增大到(16+ S),相当于把窗口值向左移动S位后获得实际的窗口大小。
             
时间戳选项——占10字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)。
             
选择确认选项——后面介绍。。。。。。。。。
填充字段:这是为了使整个首部长度是4字节的整数倍。


关键点再剖析


SequenceNumber(序号)是包的序号,用来解决网络包乱序(reordering)问题。

AcknowledgementNumber(确认号)就是ACK——用于确认收到,用来解决不丢包的问题

Window(窗口)又叫Advertised-Window,也就是著名的滑动窗口(SlidingWindow),用于解决流量控制的
TCPFlag
(标志位),也就是包的类型,主要是用于操控TCP的状态机
。 
TCP
控制字段标志:URGACKPSHRSTSYNFIN
其中,对于我们日常的分析有用的就是以下的几个字段。
它们的含义是:
SYN:
表示建立连接
FIN:
表示关闭连接
ACK:
表示响应
RST:
表示连接复位,连接重置。
     
其中,ACK是可能与SYNFIN等同时使用的,比如SYNACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYNFIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYNSYNACK包时,我们认为客户端与服务器建立了一个连接。
     TCP
产生RST响应的情况(属于硬错误):
      
四次握手不是关闭TCP连接的唯一方法.有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达)RST(Reset)包将被发送.
        1.
最简单的情况,服务器主动发送rst给客户端关闭连接。客户端readwrite直接返回rst错误。    

       2.syn发送到服务器主机,但是目的端口并未运行,则服务器(对方主机tcp内核)发送一个rst相应给客户端,于是客户端立即关闭,并产生一个ECONRFUSED错误。注意一下,如果输入的网络ip不可达的话,客户端将会持续发送syn,最后产生一个etimeout的错误,大概75秒左右。
       3.
服务器收到一个不存在的连接返回rst响应。比如,服务器重启之后,先前的一个已连接的客户端毫不之情的情况下,继续发送连接,这就是半闭连接(跟半开连接最大的不同是,半闭连接是不能使用的,半开连接可以使用),在这种情况下服务器认为收到一个不存在的连接,所以会返回rst响应。



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页