抓包看TCP协议

news2024/11/14 3:16:52

抓包看TCP协议

  • 前言
    • 一、三次握手
      • 1.1 为什么需要握手?
      • 1.2 为什么需要三次握手?
    • 二、四次挥手
      • 2.1 为何需要挥手?
      • 2.2 为何需要四次挥手?
    • 三、抓个包看看
  • 后记
  • 参考

前言

在这里插入图片描述

在计算机的世界中,通信双方的交互一般要通过网络这个中间媒介。而这个中间体在为不同的通信实体之间进行信息传递之时,可能会采用不同的通信协议,为的就是更好,更清晰、更有效率的协调双方信息传递。 在众多的通信协议中,有一些协议在实际的应用中被使用的越来越多,比如说我们今天要说的TCP协议。

学计算机网络时,TCP协议作为一个大头部可难倒了不少的同学。一部分可能是因为其确实不简单(握手过程、挥手过程,序列号,ack、封包拆包巴拉巴拉的),另一个可能是因为我们在业务上层使用的大都是应用层协议(或者框架给我们封装好了的网络库), 不太能接触TCP的实现细节。但是如果想要理解这个协议,更好的为上层业务做支撑,从底层细节来窥探协议过程不得不说是一个好的方式。

这里就以网络抓包的方式来总结TCP协议的一些重点内容,记录在此,希望可以便人便己。

关于TCP协议,在我看来其主要包括两个主要方面:

  • 一个是保证协议的正确性。即在不可靠的网络传输之上如何保证协议能够正常工作。这里面主要涉及ACK、校验和、重传、和序列号等机制。
  • 二是保证通信(和网络)的效率和性能。主要是尽可能在提高发送数据速率以及防止网络拥塞之间达到一个平衡。这里面这里面主要有选择重传、滑动窗口、拥塞控制等重点内容。

这里主要谈谈保证协议正确的中的建立连接(三次握手)和断开连接的过程(四次挥手)。

一、三次握手

在这里插入图片描述

1.1 为什么需要握手?

  握手的过程是一个协商的过程。可靠通信的双方总要确定对方是否存在,是否准备好接受数据,对吧(UDP那种不管对方的状态怎么样,直接甩过去一堆数据的不是可靠老实的TCP的风格)。同时,由于可能会遇到不可靠的快递员(下层的通信网络)弄丢包裹(发送的数据报文段)的情况,因此时不时的tcp得重新发送上丢失的报文。这时候维护一个序列号seq,很正常吧(否则,上帝也不知道该重传哪一个报文吧)。 因此,可靠的通信需要一个握手协商的过程,合作嘛,对方的底细或多或少总的了解些吧。

1.2 为什么需要三次握手?

一言以蔽之,为了防止C端连接的重复初始化。因为有可能C端的第一次握手会发送多次(比如说以前的第一次握手的报文在中间的时候丢失了或者阻塞了,那么在超时之后就会重复发送第一段握手)。所以S端也可能收到好多个建立连接的请求(第一次握手的报文),服务端没有充足的信息来判断哪个连接才是真正的。所以很无奈,S端只能全部ACK,把皮球提给客户端。

客户端由于保存了最新请求的序列号,它知道哪一个请求才是最新的,因此它会给最新的那个ACK,其他过期的直接RST掉。 这个过程也就是必须的第三次握手的过程。

先盗一张图。
在这里插入图片描述

还可以从序列号建立的角度来看三次握手。
因为TCP是全双工协议,通信的双方可以同时发送数据给对方。因此协商的过程是双向的,而且必须得到ACK确认。
不明白? 好,解释细点。

  1. 第一次握手是C端(客户端)发起请求,准备建立连接。同时提供C端的初始序列号Seq1。( hello, 我想问你几个问题,这是我的起始问题编号,你看看有没有问题?)
  2. 第二次握手是S端(服务端)对C端的请求进行回复ACK;同时,S端为了向C端发送数据,也会提供一个S段的初始序列号Seq2。(enen,我收到了你的Seq1,ok,已经记录下来了;我也有几个问题想问你,这是我的起始序列号。你确认一下?)
  3. 第三次握手是C端对S端协商参数的确认(enne,好,我这边也准备好了)。同时,C端也可以在这次握手的时候发送一部分请求的数据。

上面两个握手只保证了S端对C端的确认,保证了C端可以向S端发送数据。但是无法保证S端的协商参数还没有得到C端的确认(在不可靠的下层网络中,谁也不知道第二次握手会会不会丢失)。因此还必须有第三次过程。只有经历过第三次握手,服务端才能确认客户端准备好接受数据了。当然,由于前两次握手已经说明S端准备好接受数据了,因此C端可以在第三次握手的时候夹带些私货(真正需要发送的数据)。

二、四次挥手

在这里插入图片描述

2.1 为何需要挥手?

既然相见时协商建立了连接,那么分离时,贸然离去总不是一个好的选择,毕竟对方还一直在傻傻等待(而且还维持了一些资源)。

所以,在断开连接时,tcp协议中规定了要有断开连接,即挥手的过程。

2.2 为何需要四次挥手?

那么为何需要四次挥手才能把连接正确的断开呢。
因为,tcp是全双工的通信协议,任何时刻对方都有可能在发送数据。因此,在断开连接时要告知对方(并尽量得到对方的ack确认)。

在这里插入图片描述

通信双方都可以首先进行断开连接。这里以客户端断开连接为例进行介绍。

  1. 在tcp包中打上FIN标志,就是向对方申明,自己这端不会再发送数据了。然后进入到FIN_WAIT_1状态 。
  2. 服务端接收到客户端的请求之后,向对方发送一个ACK,然后进入到CLOSE_WAIT的状态。(客户端接受到这个ACK之后进入到FIN_WAIT_2状态)

需要注意的是这个时候服务端依旧可以发送数据,因为服务端还没表明自己已经没有数据需要发送了

  1. 当服务端把应用层的数据发送完毕之后,也会发送一个FIN标志的tcp包来表明自己已经把所有的数据发送完毕了。这个时候服务端进入LAST_ACK状态,准备接收客户端的ACK。
  2. 客户端接收到服务端发送的FIN请求之后,会回一个ACK包。然后进入到最后的TIME_WAIT状态,等待 2MSL时间,进入最终的CLOSE状态。

以上是四次挥手的过程,两个FIN,两个ACK, 匹配的相当对称完美。

这里有几个问题需要阐明一下,当客户端返回最后一个ACK之后,与它相关的四次握手都已经结束,为什么还要在等待一个2MSL的时间呢?

两个原因:

  1. 一个是为了优雅的关闭整个连接,即如果客户端的第四次ACK握手丢失了,服务端会重传第三次握手,客户端处于TIME_WAIT状态(还没有关闭连接)可以继续响应ACK。
  2. 让本次连接中的所有报文在网络中都消息(有可能有延时的报文)。比如说,如果有一个阻塞在哪儿的SYN报文一直没到,在挥手过程中姗姗来迟了,服务端接收到这个请求后还以为是个新的连接呢(服务端会放弃目前的挥手阶段,进入到新建连接的阶段,但是这个SYN请求是过期的,不会得到客户端的响应)?

更详细的分析可以参见【4】

三、抓个包看看

上面讲的是理论部分,下面我们用tcpdump和wireshark抓包看一下。关于tcpdump和wireshark软件教程网上有一大堆,这里就不赘述了。

上简单的实验代码:
客户端程序:

#!/usr/bin/env python3
import socket
HOST = '9.134.149.248'  # 服务器的主机名或者 IP 地址
PORT = 9998        # 服务器使用的端口
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))
~                                                                                                                                                            
~                                

服务端程序

#!/usr/bin/env python3

import socket
HOST = '0.0.0.0' 
PORT = 9998        # 监听的端口 (非系统级的端口:大于 1023)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)
~                                   

抓个包看看?

握手过程:
在这里插入图片描述
上面就是三次握手过程。

  1. 客户端(9.134.128.119:35254)发起请求,使能SYN标志位,其初始的序列号为Seq1=1303148347.
  2. 服务端(9.134.149.248:9998)响应ACK, ack=Seq1+1;并且其也使能SYN标志,初始序列号为Seq2=3323688393;
  3. 客户端响应ACK,ack=Seq1+1.

当然除了协商以上信息之外,我们还能看到协商的其他参数,如窗口大小等。


传输数据过程:
在这里插入图片描述
中间的几个包是数据传输过程,一来一回,典型的echo服务,不用多讲。

挥手过程:
在这里插入图片描述
上图所示是tcp断开连接时、挥手时的包,是不是有点奇怪?
哎,为啥就三个包?

按理来说,是四个挥手的包来着。两个FIN、两个ACK。 但是我们的服务端程序在收到客户端的FIN之后,自己也没有数据要发送而来,直接退出了。所以,第二次握手和第三次握手就直接合并一起发送了。这样从某种程度上所也提高了断开连接的效率。

所以说三次挥手也是有可能滴。这种方式刚好和三次握手相对称了。

不过上述过程需要一定的条件,需要开启TCP 延迟确认机制才可以。关于TCP 延迟确认机制这里就不说了,否则又是一篇文章。想了解的可以参见【3】

后记

tcp协议是网络中的一个大头,看起来简单的握手挥手很容易,但是里面有很多设计细节和要点,深究下去都有不少东西。通过实验抓包,可以把协议理解的更形象些,更具体些。

ps:写到最后才慢慢发现,有点小小的头重脚轻,抓包协议部分写的有点少了,勿喷勿怪。

参考

【1】为什么 TCP 建立连接需要三次握手
【2】为什么 TIME_WAIT 状态的 TCP 连接,收到 SYN 报文后,可以正常建立连接?
【3】美团二面:TCP 四次挥手,可以变成三次吗?
【4】被微信面麻了,问的太细节了。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVS负载均衡集群 keepalived

目录 1.实现方法 1.故障自动切换 (failover) 2.节点健康状态检查 (health checking) 2.实现LVS负载调度器 节点服务器的高可用(HA) 3.keepalived高可用故障切换原理 4.三个主要模块 5.案例 1.实现方法 1.故障自动切换 (failover) 主…

万字解析帮你深入理解MySQL!!!(事物、视图和索引)

今日金句 每一个不曾起舞的日子,都是对生命的辜负 文章目录 一、事物1.1 概述1.2 语法1.3 代码验证1.4 事务的四大特征1.5 事务并发问题1.5.1 四种隔离级别1.5.2 何为脏读,幻读,不可重复读? 二、视图2.1 概念2.2 视图与数据表的区…

pytest参数化的多种使用技巧

前言 unittest单元测试框架使用DDT进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?其实Pytest是使用pytest.mark.parametrize装饰器来实现数据驱动测试的,那么今天我们就简单来说说在它是如何进…

代码随想录算法训练营 个人总结

训练营周期:2023/5/10 - 7/8,共计60天 LeetCode记录: 参加训练营之前,就有想刷LeetCode的想法,一方便没有头绪地不知道按什么顺序刷题,另一方面也没有找到很好的讲解材料,都是自己看LeetCode页面…

Notepad++ - 只需一张图教你如何将字符串“\n”替换成换行

问题描述 今天在一个响应体日志返回换行在字符串中,没想到我输入 \n,原本是直接给我出换行效果,结果它也就给我返回 \n,那怎么分析日志啊?! 解决方案 还得是万能的 Notepad,直接看图说话

协同过滤 springboot+vue基于java的个性化图书推荐系统_1k4p4

在飞速发展的信息时代,随着网络学习的的普及,大量的学习平台和大量的图书数量迅速膨胀,使得学生在进行网络学习时面临“数据爆炸”和“数据过载”的情况,无法寻找到适合自己的图书。在面对着越来越多的图书资源,如何快…

【开源软件治理】MITRE : 开源软件

定义: 开源软件(OSS)是一种商业软件,只需同意遵守附带的 OSS 许可证即可获得全部所有权,无需立即进行第三方验证。同意 OSS 许可证允许个人、公司或政府实体根据需要尽可能频繁和广泛地复制、分发和运行 OSS 应用程序&…

【Redis】秒杀业务设计、悲观锁与乐观锁

1 全局ID生成器 一些情境下,使用数据库的ID自增将会产生一些问题。 一方面,自增ID规律性明显,可能被猜测出来并产生一些漏洞另一方面,当数据量很大很大很大时,单表数据量可能会受到限制,需要分表&#xf…

【Linux指令集】---cp指令(超详细)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

cmake include命令

目录 cmake include命令 CMAKE_CURRENT_LIST_DIR: CMAKE_CURRENT_LIST_FILE: CMAKE_CUEERNT_LIST_LINE: demo top CMakeLists.txt test.cmake subDir下的 CMakeLists.txt 结果: cmake include命令 include()命令也是将一个新的cmake内容引入当前cmake内容中. 格式: …

JVM理论(一)基础概念

JVM概述 JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;JVM特点如下 一次编译,到处运行(各CPU的架构不同的情况下JVM为了实现跨平台,字节码指…

删除链表的倒数第 N 个结点——力扣19

题目描述 法一)计算链表长度 class Solution { public:int getLength(ListNode* head){int len0;while(head){len;head head->next;}return len;}ListNode* removeNthFromEnd(ListNode* head, int n) {int len getLength(head);ListNode* dummy new ListNode …

汽车架构解析:python解析Autosar架构的ARXML

文章目录 前言一、Container-I-PDU概念引入二、以文本形式读取ARXML文件三、解析Frame的基本参数四、解析Frame中的PDU五、解析PDU中的Signals六、解析Signal中的初始值和长度七、解析Signal中的起始位置八、解析Signal中的枚举值或公式九、解析ARXML总结 前言 Autosar架构下a…

什么是人工智能?

人工智能基本定义: 人工智能(Artificial Intelligence),英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 人工…

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)

本文首发于公众号【看点代码再上班】,欢迎围观,第一时间获取最新文章。 原文:美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制) “全文共计4270字,预计阅读时间6分钟 …

MATLAB | 爱心图例与精致半透明圆角图例

本文中全部示意图均为本人自制,传播时请注明出处。 写了点小成品函数,比如如何绘制饼图时把图例上的图标变成心形: 比如如何自制半透明圆角图例: 依旧先讲原理再给出这俩代码哈: 1 原理讲解-图形对象 封闭四边形对…

3.7.使用cuda核函数加速warpaffine

目录 前言1. warpAffine2. warpAffine案例2.1 导言2.2 main函数2.3 warpaffine_to_center_align函数2.4 warp_affine_bilinear函数2.5 warp_affine_bilinear_kernel核函数2.6 AffineMatrix结构体 3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0…

【滨小之旅搜索】八皇后

题目传送门 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有…

js中判断一个对象是否存在

一、Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二、用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行环境中知否存在。如: var x 1; // x的数据类型为数值 if (x) { …

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布,将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务,并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道,人们将可以下载他们的数据档案,Microsoft 正与面向开…