今天详细学习下TCP链接的三次握手四次挥手,因为开发web服务还是会经常遇到一些网络问题的。其实这方面的资料很多,可能我们看过很多次但也忘了无数次[捂脸],这次我主要通过抓包例子来展示这个过程。

  • TCP传输控制协议(TransmissionControlProtocol)

他的特点是基于流、提供可靠数据传输,先建立连接再传输数据。提供如超时重传、流控等各种机制,这样的特点同时也导致了tcp会使用更多的连接,占用更多的资源。UDP则是直接发送数据,不保证数据的到达与接收。我们再把这个流程图拿过来瞅瞅。

TCP建立与断开

  • 三次握手

三次握手

这里我用本机50319端口请求远端80服务, 能清楚的看到三次TCP的连接,你是否有疑问为什么是三次,不是两次,不是四次,其实这里是兼容安全与效率。

我们说TCP数据保证基于SYN与ACK的存在,其实这里明显看到请求号72(也就是80->50319的回复)是将SYN+ACK合为了一条数据返回,这里我想应该可以拆开吧,但是拆开浪费一次链接。所以这里建立连接需要三次。

再来说下三次握手:

小明:你好丽丽,在吗?我是小明 请求号65 50319---->SYN(Seq=0)------>80

小丽:你好小明,我在呀~~ 80->SYN+ACK(Seq=0,Ack=1)-->50319

小明:好的,那我们开始谈谈心吧!! 50319->ACK(Seq=1, Ack=1)---->80

小丽:[爱慕] Established

小明:[送心] Established

  • 四次挥手

四次挥手

这里先说明一点,HTTP1.1之后能自带keep-alive属性,也就是说同一个客户端的http请求可以共用一个tcp连接,这样能防止tcp连接的浪费,截图说明

HTTP keep-alive

我们在测试的时候可以关闭这个keep-alive, 在请求的时候设置connetion:close就可以了,这样可以方便我们抓包验证。如果开着的话,当前的tcp连接就不会立刻断开的截图说明

postman 关闭keep-alive

再说回四次挥手,我们看到请求号(212)80->56427发送FIN标识的消息,这代表80端要结束连接了,56427->80回复了ACK,请求号(214), 随后呢56247->80发送FIN标识请求号(215),代表自己也没有消息发送可以结束了,随后请求号(216)80->56247发送ACK确认,至此连接关闭。

.......

小明:好吧,我说完了! 80-----FIN----->56427

小丽:嗯嗯! 56427------ACK--->80

小丽:我也没话说了! 56427-----FIN----->80

小明:再见!!! 80-----ACK----->56427

小明:[流泪]closed!!

小丽:[吐]closed!!

那为啥是四次挥手呢,如果是三次就像连接建立一样将最后56427->80的ACK+FIN合并为一条可以吗,当然不可以,这是因为TCP的连接双方能发消息也能接受消息,FIN的发出代表本方将关闭消息发送,而无法确认对方是否还有消息发送过来,估需要双方分别确定已关闭消息发送。

  • 关于状态的说明

这里我们在服务端加入sleep操作限制连接的立刻断开如代码

<?phpsleep (60);echo "hello World ";

我们观察下链接状态的变化

服务端状态流转:

LISTEN->SYN-RECEIVED->ESTABLISHED->CLOSE-WAIT->LAST-ACK->CLOSED

客户端状态流转:

SYN-SENT->ESTABLISHED->FIN-WAIT1->FIN-WAIT2->TIME-WAIT->CLOSED

这里可能跟上面说的有差别,是因为我们这里是80主动关闭的连接。另外有些状态流转太快,我根本看不到啊[吐血]

状态我还需要再学习学习,里面的玩意太多了,下个分享,我们找一些例子来学习下,重点是TIME_WAIT、2SML啥的。

总结:

  • TCP的消息可靠性通过SYN+ACK实现
  • TCP三次握手+四次挥手是有原因的
  • TCP的连接双方都有各自的状态流转
  • 要通过一些工具如netstat、tcpdump去实际查看网络连接状况

tcp抓包返回fin_TCP/IP学习二TCP链接建立与断开相关推荐

  1. java抓取路由器tcp,IP 和 TCP 抓包分析实验

    IP 和 TCP 抓包分析实验 实验拓扑 图 1-1 注:如无特别说明,描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备, R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设 ...

  2. 计网 - TCP 实战:如何进行 TCP 抓包调试?

    文章目录 Pre 接口列表 开启捕获功能 观察 TCP 协议 消息视图 观察 HTTP 协议 过滤和筛选 报文颜色 总结 QA: 请你用自己最熟悉的语言,写一个 UDP 连接程序,然后用 Wiresh ...

  3. Wireshark下载、Wireshark使用、Wireshark抓包、ARP抓包、ICMP抓包、TCP抓包、HTTP抓包

    Wireshark下载.Wireshark使用.Wireshark抓包.ARP抓包.ICMP抓包.TCP抓包.HTTP抓包 Wireshark下载 Wireshark抓包即快速定位数据包技巧 常见协议 ...

  4. 安卓抓包 python hook_搞定某APP的TCP抓包,并直接调用so文件进行Hook抓取

    APP抓包比较繁琐,尤其是对方优先走socket,发TCP包,而不是走应用层发http/https协议.这种抓包更烦躁,绝大部分利用中间人攻击原理这种代理抓包软件都抓不到tcp请求,代理抓包软件大都只 ...

  5. 【linux tcp抓包之三次握手】

    [linux tcp抓包之三次握手] 写在前面 三次握手 tcpdump 参数说明 返回值说明 IP 127.0.0.1.42004 > 127.0.0.1.5051 Flags [S] win ...

  6. 万能的wifi空口Tcp抓包方式

    主要介绍下最近使用中感觉很万能的空口抓包方式和wireshank分析工具使用: 目的:抓取各种设备网络通信过程中数据包,定位并分析软硬件设计中问题 背景: Tcp抓包方式有很多种,但是有一些限制: t ...

  7. Java TCP 抓包简单示例

    Java TCP 抓包简单示例 由于目前网上没有一篇能真正方便读者操作的此类文章,本文对此通过示例做个简单介绍. 缘起 有一天本来在看头条,然后看到一则游戏的广告,看画面可能是我喜欢的建造类型(纪元1 ...

  8. TCP/IP学习笔记:TCP/IP协议介绍

    TCP/IP的通讯协议 这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础.TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.2 ...

  9. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

最新文章

  1. 国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
  2. 收购美新!中国MEMS传感器和国外差距多大
  3. oracle 触发器的实例(转)
  4. iOS UI-UIScrollView控件实现图片缩放功能
  5. 多线程编程3 - NSOperationQueue
  6. HTTP header中的 Cache-control
  7. POJ 3696 欧拉函数+快速幂
  8. Delphi WebService 的编写、调试、发布(IIS)、调用
  9. Mybatis的查询、关联查询
  10. 使用robo3t操作mongodb以及文档的插入、更新、删除以及查询操作
  11. android模拟器电视,Android TV开发之模拟器的设置
  12. java基础之Web全套知识点梳理
  13. 复合辛普森公式matlab,复合梯形公式、复合辛普森公式 matlab
  14. 基于SSM超越宠物医院诊治系统
  15. 3 什么是linux磁盘分区,3. Linux系统磁盘分区介绍
  16. 神经网络在通信中的应用,神经网络技术及其应用
  17. 4.24、半关闭、端口复用
  18. FPGA调用OLED
  19. python-pep8规范
  20. F2FS源码分析-2.1 [F2FS 读写部分] F2FS文件数据组织方式以及物理地址的映射

热门文章

  1. [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式
  2. Insider Dev Tour 2019 全球巡演 苏州站
  3. Mac中搭建Kubernetes
  4. 西安活动 | 2019年1月13号 拥抱开源, 又见.NET 线下交流活动报名进行中
  5. ASP.NET Core URL Rewrite中间件
  6. 拥抱.NET Core系列:MemoryCache 缓存选项
  7. API网关Ocelot 使用Polly 处理部分失败问题
  8. TagHelper是怎么实现的
  9. 【ArcGIS风暴】ArcGIS自定义坐标系统案例教程---以阿尔伯斯投影(Albers)为例
  10. ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法