IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Linux——TCP协议(三次握手(从数据包名,双方连接状态,包序管理分析),四次挥手(从数据包名,双方连接状态分析)) -> 正文阅读

[网络协议]Linux——TCP协议(三次握手(从数据包名,双方连接状态,包序管理分析),四次挥手(从数据包名,双方连接状态分析))


前言

TCP协议的连接是面向连接,可靠传输,面向字节流的,而TCP之所以能保持可靠传输是因为三次握手四次挥手

1. 三次握手

1.1 从数据包名称连接双方状态分析三次握手

首先我们通过数据包名连接双方的连接状态来了解三次握手的过程

如下图所示
在这里插入图片描述
客户端在发送SYN数据包后客户端的状态变为SYN_SENT,当服务端接收到客户端发送的SYN数据包后,服务端的状态变为SYN_RECV,当客户端接收到服务端的SYN数据包和ACK数据包后,客户端的状态变为ESTABLISHED,当服务端接收到客户端发送的ACK数据包时,服务端的状态变为ESTABLISHED,此时客户端和服务端已完成三次握手,即建立了双向连接。

【问题一】为什么要三次握手,而两次握手不行呢?

三次握手可以保证通信双方都是有连接的,若只进行两次连接服务端回复客户端的应答并发送SYN数据报,客户端不作出回应,并不能确保客户端接收到来自服务端的数据,因此两次握手只能保证客户端到服务端的连接是有效的,并不能保证服务端到客户端的连接有效

1.2 包序管理

1.2.1 抓网络数据包

  • 在windows平台下,可以使用wireshark软件来抓取网络数据包
    ?
  • 在linux平台下,使用 tcpdump 来抓取网络数据,TCP和UDP的包都可以使用此命令抓取
    ?
    1)万能公式:tcpdump -i any port [端口] -s 0 -w xxx.dat
    ?
    2)使用root用户进行抓包
    ?
    如上2)中的命令是对某个端口进行抓包,并将结果放入xxx.dat中,但我们不能直接对xxx.dat中的数据进行分析,需要借助windows平台下的wireshark软件来分析

1.2.2 分析TCP网络数据包

我们之前单进程的客户端和服务端的代码,使用tcpdump抓包分析三次握手的过程

首先在root用户下输入 tcpdump -i any port 18989 -s 0 -w 123.dat ,先进行抓包,再让客户端服务端程序跑起来防止三次握手结束,没有抓到,让客户端服务端跑一会后终止程序,我们可以看到如下图所示:
在这里插入图片描述
可以看到一共抓到了64个数据包,并产生了一个123.dat文件,通过Xftp将123.dat传到windows下使用wireshark进行分析,如下图所示:
在这里插入图片描述

1.2.3 分析TCP包序号

为什么TCP需要包序号?

本质上是为了维护可靠传输,客户端维护了一套序号,服务端也维护了一套信号

  • client–>server:消耗(seq)的是客户端维护的序号,服务端告诉客户端自己收到数据的时候,是确认(ACK)客户端的序号
  • server–>client:消耗(seq)的是服务端维护的序号,客户端告诉服务端自己收到数据的时候,是确认(ACK)服务端的序号

观察如下图所示抓到的包,分析TCP包序号的变化
在这里插入图片描述
分析如下图所示:
在这里插入图片描述

  • 纯ACK数据包不消耗序号
  • TCP数据也消耗序号,一个字节消耗一个序号
  • 确认序号ACK=消息发送方的序号+数据长度
  • 确认序号的作用是:告知消息发送方,期望下次发送数据从哪一个序号开始发送
    ?
    注意:TCP三次握手中,协商双方的其实序号并不一定是从0号序号开始,可以从任意位置开始,只要双方协商好就行
    ?
    TCP可靠的原因就在于序号,丢了那个数据都可以知道,因为一个字节占一个序号

2. 四次挥手

通过数据包名和连接双方的状态分析四次挥手的过程如下图所示:

在这里插入图片描述
数据传输完毕以后,双方都可以释放连接。在最开始的时候,客户端与服务器都是处于ESTABLISHED状态,如果客户端主动关闭,则服务端被动关闭;若服务端主动关闭,则客户端被动关闭;

假设客户端主动断开连接,服务端被动断开连接

1)客户端进程发出连接释放报文FIN=1,并且停止发送数据。此时,客户端进入FIN-WAIT1(终止等待1)状态。这时候客户端处于一个半关闭的状态,即客户端已经没有数据需要发送了,但是服务器若要发送数据,客户端依然需要接受。
?
2)服务器收到连接释放报文后,发送确认报文ACK=1。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。进入CLOSE_WAIT后说明服务器准备关闭连接。
?
3)客户端收到服务器的确认请求之后,此时客户端就进入了FIN-WAIT2(终止等待2)状态,等待服务器发送连接释放报文。(在这个之前还需要接受服务器发送的最后的数据)。
?
4)当服务器真正调用close关闭连接时, 会向客户端发送FIN=1, 此时服务器进入LAST_ACK(最后确认)状态, 等待客户端的最后一次ACK回复。
?
5)客户端收到服务器的链接释放报文之后,必须发出确认报文ACK=1。此时,客户端就进入了TIME-WAIT(时间等待)状态,等待用户关闭套接字。注意此时TCP链接还没有释放,必须经过2*MSL(报文最大生命周期)的时间后,当客户端撤销相应的TCP后,才进入CLOSED状态。
?
6)服务器只要收到客户端发出的确认,彻底关闭连接,立即就进行CLOSED状态,于是就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

【拓展】MSL
MSL:报文的最大生命周期,在传输中,一个报文的最大生命周期就是一个MSL时间,过了这个时间该报文就会被丢弃

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:55:33  更:2021-07-11 16:56:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 9:09:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码