TCP连接过程及报文解析
可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的。
那么具体的握手挥手的过程是怎么样的呢?
这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程。
实验方法:
写一段简单的代码 代码客户端和服务端,分别部署,让客户端主动像服务器发起连接,随后断开。让WireShark抓股这个过程中产生了哪些包,并对其分析。
(注:WireShark默认不支持LoopBack,需要将客户端和服务端分开部署,或是配置WireShark)。
首先,我们先来看一下连接建立和断开的过程中,产生了哪几个包。
从上图我们可以看到,正好是七个包,符合我们三次握手四次挥手的过程。
分析其过程,WireShark已经为我们解析了每个TCP包的标志位(之后会详细解释,主要用来区分每个包的用途)。
TCP建立连接:
1).客户端向服务器发起建立连接请求(SYN)
2).服务端收到后,像客户端回复一个建立连接请求的响应(SYN,ACK)
3).客户端收到后,继续向服务端发送一个响应(ACK)
三次握手完成,正式建立连接。
TCP断开连接
1).断开发起方向另一方发送断开连接请求(FIN,ACK)
2).另一方收到后,回复一个响应(ACK)
3).再由另一方主动发送一个断开连接请求(FIN,ACK)
4).断开发起方收到后,回复一个响应(ACK)
四次挥手完成,断开SOCKET连接。
我们通过图片来加深一下印象:
了解完过程,再让我们通过分析第一个包的内容,初步了解下TCP报文结构:
我们可以看到整个消息帧是66个字节:
1).该帧是一个以太网消息帧:分为首部和数据两个部分。
首部前六个字节(30 9c 23 bc 9d 80)表示目的地MAC地址
后六个字节(30 9c 23 1c 0f 74)表示源MAC地址
我们可以看到当数据在链路层中传输的时候,是由MAC地址标识定位的。
之后两个字节(08 00)表示上层协议类型(这里的0x 08 00表示的就是IP协议)
剩余的52(66 - 6 - 6 - 2)个字节为数据部分,来承载上层协议(本例中为IP协议)的消息。
2).从第十三个字节开始为IP协议的包,
IP协议同样分为首部和数据两部分内容。
首部由20字节固定长度+选项两部分构成。
先看来固定长度的内容
第一个字节拆成两部分解析,前四位表示版本号,后四位表示首部的长度:0x45,4 表示版本4,也就是我们常说的IPv4,5表示5个单位(最小单位为4字节),因此是5 * 4 = 20个字节(正好为固定长的,因此这个包中没有选项)。
第二个字节表示服务类型:00
接下来的两个字节表示消息总字节数:0x 00 34 = 52(字节)
接下来的两个字节(0x 4e da)表示标识符(Identification),表示唯一的一个IP消息包,同一包的IP分片消息此ID相同,用来对IP消息重组
接下来的两个字节(0x 40 00)表示标志位(Flags),前四位中的第一位为预留,后三位为标识位,又来表示是否有分片,是否是最后一片,后13位为片偏移,具体可以了解IP分片
接下来的一个字节是TTL(Time To Live):表示最大生存时间,通常用来表示最大穿越路由层数,没穿过一个路由,TTL变回-1,到0时这个IP包就会被丢弃,此处是0x80 = 128
接下来的一个字节表示上层协议,此处是0x06,表示上层是TCP协议
接下来的两个字节是校验和(0x00 00)
接下来的四个字节(0x c0 a8 01 9c)是源IP地址,尝试解析一下 c0 = 12 * 16 + 0 =192 , 依次解析得到(192.168.1.156)
接下来的四个字节(0x c0 a8 01 66)是目的IP地址
到此一共1 +1 + 2 + 2 + 2 + 1 + 1 + 2 + 4 + 4 = 20个字节。此例中没有选项,因此剩下的32个字节的数据,用来表示上层协议(TCP)
3).从f8开始就是我们的TCP协议。
TCP协议也由首部和数据两部分组成,首部和IP协议类似,由20字节固定长度和可选部分组成,数据部分主要是包含了上层协议的内容(如HTTP协议等)。
TCP协议的头两个字节(0x f8 eb)表示源端口
后两个字节(0x 1a 0a)表示目的端口
接下来的四个字节表示序列号seq(0x 43 03 7a c8)
接下来的四个字节表示应答号ack(0x 00 00 00 00)
接下来的两个字节(0x 8002)表示首部长度及标志位:首先, 前四位表示首部长度(8,单位同样是4字节,因此表示首部为32字节);后12位中的前三位为预留,后九位为标志位。
了解一下后12位,其中Reserved表示三位。
Reserved |
NS |
CWR |
ECE |
URG |
ACK |
PSH |
RST |
SYN |
FIN |
NS(NONCE):有了解的朋友可以补充一下
CWR(Congestion Window Reduce):拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包,发送端通过降低发送窗口的大小来降低发送速率
ECE(ECN Echo):ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11。更多信息请参考RFC793。
URG(Urgent):该标志位置位表示紧急(The urgent pointer) 标志有效。该标志位目前已经很少使用参考后面流量控制和窗口管理部分的介绍。
ACK(Acknowledgment):取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。
PSH(Push):该标志置位时,一般是表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
RST(Reset):用于复位相应的TCP连接。通常在发生异常或者错误的时候会触发复位TCP连接。
SYN(Synchronize):同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。类似的后续文章介绍中当这个SYN标志位有效的时候我们称呼这个包为SYN包。
FIN(Finish):带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。
回到TCP报文中来:
接下来的两个字节(0x 20 00)表示窗口大小(Window Size),表示TCP还可以接受的空间大小。
接下来的两个字节(0x 84 79)表示校验和(Checksum),用来校验数据
接下来的两个字节(0x 00 00)表示优先级指针(Urgent Pointer),只有当标志位中的URG设为1时才有效,
到此,TCP首部的固定长的20个字节已经解析完毕。
我们看到首部还剩余12个字节,这个TCP首部中的选项,选项是可选的,以四字节为单位扩展,用来记录时间戳等内容。
本包抓取的是TCP第一次握手的内容,因此TCP报文中没有数据。
说了这么多,可能还是会有点乱,对上述内容整理一张图片帮助大家加深理解:
另外,上述解析的过程可以在WireShark中很清楚的看到,建议大家自己也抓取一个包,加深理解。
TCP连接过程及报文解析的更多相关文章
- 不可不知的socket和TCP连接过程
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- zabbix主动、被动TCP连接过程
zabbix主动.被动TCP连接过程 https://blog.csdn.net/u010668387/article/details/79460183
- 详解TCP三次握手(建立TCP连接过程)
在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...
- 详解TCP四次挥手(断开TCP连接过程)
在讲述TCP四次挥手,即断开TCP连接的过程之前,需要先介绍一下TCP协议的包结构. TCP协议包结构: 这里只对涉及到四次挥手过程的字段做解释 (1) 序号(Sequence number) 我们通 ...
- tcp连接过程中的三次握手和四次挥手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手握手建立连接 @第一次握手: 建立连接是,客户端A发送SYN包到服务器B,并进入SYN_SEND状态,等待B确认. @第二次握手: 服务 ...
- TCP连接过程
TCP建立连接与释放连接 最近复习准备<计算机网络>考试,感觉TCP协议建立连接与释放连接这两个过程比较重要,所以把自己理解的部分写下来. 1.建立连接:(三次握手) (1)客户端发 ...
- 内核参数优化之2-1 tcp/ip 标志位报文解析
以下内容纯属虚构,切勿轻易相信! 众所周知,tcp/ip三次握手和四次挥手,均由syn/ack/fin三个标志位报文决定,但是这三个标志位报文,并不是说在构建连接的时候只发送一次的,因为协议不知道网络 ...
- 建立TCP连接过程
1.服务器实例化一个ServerSocket 对象, 表示通过服务器上的端口通信. ServerSocket serverSocket = new ServerSocket(port); 2.服务器调 ...
- libnids TCP数据流重组,显示TCP连接过程的程序总无法捕获数据包解决办法:
法一: 指定可用网卡: nids_params.device="lo"; 法二: nids.h中有这么一段: struct nids_chksum_ctl { u_int ne ...
随机推荐
- PTA数据结构与算法题目集(中文) 7-23
PTA数据结构与算法题目集(中文) 7-23 7-23 还原二叉树 (25 分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. 输入格式: 输入首先给出正整数N(≤50) ...
- PTA数据结构与算法题目集(中文) 7-19
PTA数据结构与算法题目集(中文) 7-19 7-19 求链式线性表的倒数第K项 (20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给 ...
- Visual Studio Code 1.44 解决中文代码显示乱码问题(小白图文教程)
现今主流的计算机中文字符编码方案是:GBK和UTF-8. 不同编码方案使用不同的字符集,GBK字符集在中文字符长度和字符数量上存在绝对优势,但对国外字符并不支持.所以,完全面向国内的程序/网页使用的是 ...
- Docket 容器引擎
Docker 是世界领先的软件容器平台.是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中, 然后发布到任何流行的Linux或Windows机器上,可以实现虚拟化(软件 ...
- Flask 入门(三)
官方的文档虽然正规,但是有点太过书面语,有时候,明明很简单的一个程序,如果非要看它的说明,反而会让人疑惑不解,倒不如看一下别人写的简单的一个demo,jinjia2模板看官方的文档看了5回,愣是不明白 ...
- mount --bind绑定命令
将目录或文件DirFile-1绑定到目录或文件DirFile-2上,所有对DirFile-2的访问就是对DirFile-1的访问 mount --bind [DirFile-1] [DirFile-2 ...
- elasticsearch7.6.2实战(2)-es可视化及分析平台-kibana
1. 场景描述 elasticsearch部署完成后,es官方提供了可视化.分析及管理平台-kibana,部署下,有需要朋友参考下,不谢! 2. 解决方案 2.1 下载 (1)地址:https://w ...
- Python 分析后告诉你闲鱼上哪些商品抢手?
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:[Airpython] PS:如有需要Python学习资料的小伙伴可以 ...
- CVE-2019-0193 Apache solr velocity模块漏洞
Solr简单介绍 Solr是建立在Apache Lucene ™之上的一个流行.快速.开放源代码的企业搜索平台. Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自 ...
- selenium 窗口的切换
窗口切换需要用到一个关键词:句柄,每个窗口唯一的标识 获取句柄的方法:driver.getWindowHandle(); 下面的例子是点击京东页面,跳转到京东手机页面,然后关闭京东页面 driver. ...