TCP报文解析

1.端口号

  标记同一台计算机上的不同进程

  源端口:占2个字节,源端口和IP的作用是标记报文的返回地址。

  目的端口:占2个字节,指明接收方计算机上的应用程序接口。

  TCP报头中的源端口号和目的端口号同IP报头中的源IP和目的IP唯一确定一条TCP连接。

2.序号:Sequence number(顺序号码)

  占4个字节,是TCP可靠传输的关键部分。是本报文段发送的数据组的第一个字节的序号。

  在TCP传输流中,每一个字节一个序号。(例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400.)所以序号确保了TCP传输的有序性。序列号的初始值并非为0,而是在建立连接以后由随机数生成,后面的计算则是对每一字节加1。

3.确认序号:Acknowledge number(确认号码)

  即ack,占4个字节,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK=1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

4.数据偏移

  占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远。

  由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任选子段时长度为20字节;4位首部长度字段所能表示的最大值为1111,转化为10进制为15,故报头最大长度为15*32/8=60个字节。首部长度也叫数据偏移。

5.保留

  为将来定义新的用途保留,一般置为0。

6.控制位

  SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
  ACK:确认序号标志。1:确认号有效;0:忽略确认号段。
  FIN:结束标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
  PSH:push标志。1:带有push标志的数据,表示接收方在接收到该报文后应尽快将这个报文段交给应用程序,而不是缓冲区排队。
  RST:重置连接标志。用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。 
  URG:紧急指针标志。1:紧急指针有效;0:忽略紧急指针。
位码即tcp标志位,有6种标示  
# SYN(synchronous建立联机)  
SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段。UDP是一种面向无连接的通信协议,因此不检查。
对端是否可以通信,直接将UDP包发出去。TCP正好相反,它会在数据通信之前,通过TCP首部发送一个SYN包。作为建立连接的请求等待确认应答。
如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答。未能到达,就不会进行通信。此外,在通信结束时会进行断开连接的处理(FIN包)。    
# ACK(acknowledgement 确认)  
ACK: 标识确认序号是否有效。即当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。     
这个消息叫做确认应答(ACK)。在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。     
由此,即使产生丢包,仍然能够保证数据能够到达对端,实现可靠传输。ACK超时未收到,会重发,但数据也不会。
被无限的、反复的重发。达到一定的重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机。
发生了异常,强制关闭连接,并且通知应用通信异常强行终止。    
# FIN(finish结束)  
FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段。    
# PSH(push传送)  
PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走。    
# RST(reset重置) 
RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段
# URG(urgent紧急)  
URG: 标识紧急指针是否有效   
# Sequence number(顺序号码)   
# Acknowledge number(确认号码)

6.1 收到RST原因

在某些特殊情况下,TCP连接的一端会向另一端发送复位报文段,以通知对方关闭或重新建立连接。

一般来说,有以下三种情况:

1.  访问不存在的端口。若端口不存,则直接返回RST,同时RST报文接收通告窗口大小为0.其实客户端向服务器的某个端口发起连接,如果端口被处于TIME_WAIT 状态的连接占用时,客户端也会收到RST

2. 异常终止连接。一方直接发送RST报文,表示异常终止连接。一旦发送方发送复位报文段,发送端所有排队等待发送的数据都被丢弃。应用程序可以通过socket选项                                                SO_LINGER来发送RST复位报文。

3.处理半打开连接。一方关闭了连接,另一方却没有收到结束报文(如网络故障),此时另一方还维持着原来的连接。而一方即使重启,也没有该连接的任何信息。这种状态就叫做半打开连接。而此时另一方往处于半打开状态的连接写数据,则对方回应RST复位报文。

7.窗口

  滑动窗口大小,用来告知接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是2个字节,因而窗口大小最大为65536。

       TCP以1个段为单位,每发一个段的数据进行一次确认应答的处理,这样的传输方式有一个缺点。那就是,包的往返时间越长通信性能就越低。为解决这个问题,引入窗口这个概念。确认应答不再是以每个段,而是以更大的单位进行确认时,转发时间将会被大幅度缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。

8.校验和

  奇偶校验,此校验和是针对整个TCP报文段的,包括TCP报头和TCP报文数据段,以2个字节进行计算所得。由发送端计算和存储,并由接收端进行验证。

9.紧急指针

  只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

10.选项和填充

  最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN=1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头部是32的整数倍。

11.数据部分

  TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值