当前位置: 首页 > article >正文

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首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。


http://www.kler.cn/news/159833.html

相关文章:

  • C# 图片下载工具类
  • 查收查引(通过文献检索开具论文收录或引用的检索证明)
  • pycharm上传代码至gitLab
  • 逻辑漏洞之越权漏洞
  • 每天一点python——day88
  • Ubuntu 环境安装 Kafka、配置运行测试 Kafka 流程笔记
  • 案例052:用于日语词汇学习的微信小程序
  • 【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数
  • 前端模拟新闻列表ajax请求 mocky
  • TortoiseGit 小乌龟svn客户端软件查看仓库地址
  • 分布式锁常见实现方案
  • Android自动化测试中使用ADB进行网络状态管理!
  • CMake编译C++项目并链接动态库
  • 【Linux】信号的保存和捕捉
  • 在eclipse中安装python插件:PyDev
  • Python环境管理利器-Anaconda介绍与安装
  • 三相电表可以当作高压电表使用吗?
  • blade 项目
  • Vue学习笔记-activated和deactivated生命周期
  • 七、VMware虚拟机安装和docker容器部署项目
  • 二叉树OJ题之三
  • js基础之事件监听案例入门
  • Vue3炫酷可旋转的3D地球
  • 【500强 Kubernetes 课程】第4章 dockerfile基础篇-基本语法
  • Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2
  • Kafka 的特点和优势
  • 电脑出现蓝屏提示0xc0000001错误的解决办法,解决错误代码0xc0000001
  • 基于c++版本链栈改-Python思维总结
  • Java八股文面试全套真题【含答案】-XML篇
  • CSU计算机学院2023秋C语言期中题目思路分享(前三道题)