网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言
TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方。TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手),双方不再继续通信时,会将连接释放(正常情况下四次挥手)。下面就抓包分析TCP三次握手和四次挥手的过程。
建立连接——三次握手

第一次握手


客户端192.168.1.148发送一个建立TCP连接的请求包给服务器端174.143.213.184。可以从数据包中得出,建立连接源端口为57678,目标端口为80,确认编号为0。同步标志位SYN被置为1,表示请求连接建立。TCP首部长度大于20字节,说明选项中也附带了一些内容,给出最大段长度为1460字节,允许使用选择确认等。
第二次握手


服务器端收到请求后,发送给客户端确认包。该数据包中包含服务器的初始序列号为0,以及对请求包的确认,所以确认号为1也是期望下一个收到的包的字节流编号是从2开始的。
第三次握手


客户端向服务器端发出确认包,序号是从1开始,确认号为1,标志位只有ACK被置为1,说明这是一个确认包。于是便完成TCP连接建立。在这个包发送后,客户端就已将可以向服务器端请求数据,正常通信了。
关闭连接——三次挥手
四次挥手过程
放一张以前做的图介绍TCP四次挥手的过程:

当客户端向服务器端发起连接关闭请求时,因为服务器端还有数据发送给客户端所以不能立马将连接关闭,于是先回复客户端ACK表示你的请求我已经收到。然后将剩下的数据继续发送给客户端,数据发送完毕后,在回复给客户端的ACK包中将FIN标志置为1,请求连接关闭。最后,客户端回复ACK包表示收到服务器端的FIN。服务器端收到此ACK包后立马就关闭连接。客户端继续等待2MSL(因为发送给客户端的ACK包可能会丢失),服务器端没有重传包回来就关闭连接。到此,整个连接算是完全结束。
以上过程是标准的释放过程,但是在实际通信当中,可能只会有三次挥手。当客户端发送FIN包给服务器端,服务器端因为没有数据再传给客户端,于是就会在回复给客户端的FIN的ACK包中将FIN字段置位1,发送给客户端的包就为ACK+FIN,表示我也要求连接关闭。然后,客户端回复一个ACK确认收到FIN+ACK包,服务器端就关闭连接,客户端等待2MSL后也关闭连接。

上图就是三次挥手的数据包截图
第一次挥手


客户端192.168.1.140向服务器端172.143.213.184请求断开连接。
第二次挥手


因为服务器端没有数据传给客户端于是将回复给客户端的ACK包中FIN置为1,表示也请求连接断开。
第三次挥手


客户端对服务器端的FIN+ACK进行回复。服务器端收到该ACK包就关闭连接。
小结
回头想一想TCP为什么是三次握手呢,两次好像也是可以的。但是,这里存在一个问题,网络中的包是会延迟的,如果有一个很久以前的连接请求发送到了服务器端(实际上客户端已经发送了新的连接请求给服务器端,完成了数据请求并且连接已经关闭),服务器端并不知道这是以前的连接请求,于是也会回复一个ACK并且等待客户端的回复。客户收到该ACK不会回复,就会造换成服务器端一直等待并且超时重发ACK包。所以,两次握手是不可以的,四次握手也是显得多余的。三次握手最后一次客户端回复ACK给服务器端,服务器端收到后,才分配资源等待客户端的正式请求。
总结一句话需要三次握手的原因是:为了防止以前的连接请求即失效连接请求发送到服务器而造成错误。
网络协议抓包分析——TCP传输控制协议(连接建立、释放)的更多相关文章
- 网络协议抓包分析——IP互联网协议
前言 IP协议是位于OSI模型的第三层协议,其主要目的就是使得网络间可以相互通信.在这一层上运行的协议不止IP协议,但是使用最为广泛的就是互联网协议. 什么是IP数据报 TCP/IP协议定义了一个在因 ...
- 网络协议抓包分析——ARP地址解析协议
前言 计算机之间可以相互通信的前提是要知道对方的地址,才可以发送信息给其他计算机,就像别人要联系你也得先知道你的电话号码一样.这里的地址因为网络分层的原因就包括IP地址和MAC地址(即网卡地址.硬件地 ...
- wireshark抓包分析——TCP/IP协议
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
- Wireshark抓包分析TCP 3次握手、4次挥手过程
Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
- Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
- Wireshark抓包分析TCP“三次握手,四次挥手”
1.目的 客户端与服务器之间建立TCP/IP连接,我们知道是通过三次握手,四次挥手实现的,但是很多地方对这个知识的描述仅限于理论层面,这次我们通过网络抓包的方式来看一下实际的TCP/IP传输过程. 2 ...
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- Wireshark抓包分析/TCP/Http/Https及代理IP的识别
前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...
随机推荐
- Caused by: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
解决办法:查看与该项目中的所有#{},应该是 #{}的中间没有写值
- php json_encode与json_decode详解及实例
通常情况下,json_decode()总是返回一个PHP对象,而不是数组.如果返回数组,需要添加true参数 如:json_decode($res,true) 一.json_encode() 该函数主 ...
- date函数的属性
date () a: "am"或是"pm" A: "AM"或是"PM" d: 几日,两位数字,若不足则补零:从" ...
- java课程之团队开发冲刺阶段1.7
一.总结昨天进度 1.昨天学习了对数据库增删改查的基本操作,并且可以使用代码实现操作 二.遇到的问题 1.由于是学习阶段,没有遇到太大阻碍,但是最终需要实现的是联网进行数据库的读写或者是对本地数据库的 ...
- bootstrap table 标题列重复
使用bootstrap table生成表格,出现一个奇怪问题,标题列重复.查了一大堆资料,没有找到可以解决问题的. 以为是类库版本的问题,全部替换成了example中的引用,还是这个问题. 后来仔细查 ...
- class A<T> where T:new()
class A<T> where T:new() 这是类型参数约束,where表明了对类型变量T的约束关系.where T:A 表示类型变量是继承于A的,或者是A本身.where T: n ...
- 2019PHP面试题最全面归纳总结
1.请选择以下代码运行的结果: <?php if ('1e3' == '1000') echo 'LOL'; ?> A 无任何输出结果 B LOL C 不执行且报错 解析:1e3 ...
- python处理参数的getopt的使用
在写脚本程序的时候需要添加一些额外的参数来实现脚本的附加功能或者增强功能,通常的做法是同sys.argv[i]直接来获取参数的值,但是这个比较局限,要求参数的输入一定要按照顺序. fileName = ...
- Springboot关于脚本脚本启动的项目:
#!/bin/bash if [ -f ~/.bash_profile ];then . ~/.bash_profilefi JAVA_HOME=/usr/local/usr_software/jd ...
- Flutter
2015年, Google 内部开始测试另一种高性能的编程方式,那就 Google 的 Sky 项目.Sky 项目使用网页开发语言Dart开发原生Android 应用,强调应用的运行速度和与 Web ...