TCP的握手和挥手
三次握手
三次握手具体过程是什么?
客户端发送一个数据包
将SYN置成1,表示希望建立连接
这个包中的序列号是X
服务器收到客户端发来的数据包
通过SYN得知这是一个建立连接的请求
于是发送一个响应包
并将SYN和ACK标志成1,
假设发送包的序列号是是y
且确认序列号必须是x+1,表示收到了客户端发来的SYN请求
客户端收到服务端的响应包后需要进行确认
- 确认包中将ACK置为1,并将确认序列号设置为y+1。表示收到了服务端的SYN请求
为什么需要第三次握手?
主要是要两个目的:信息对等和防止超时
信息对等
防止超时
即防止出现请求超时,导致脏连接。假设发生了下面的情况:
- 客户端发送第一个请求,但是请求超时,报文依旧在网络上传输。
- 客户端发送了第二个请求,服务端成功接收到了
- 服务端发送确认报文,连接成功
- 传输数据完后,释放连接(两者就都不是SYN_CENT状态)
- 之后,超时请求到达服务端,然后服务端接收,建立脏连接
- 因为客户端不是SYN_CENT状态,直接丢弃服务端的确认报文,导致只有服务端单方面建立连接
如果是三次握手的情况,服务端即使收到了超时请求报文,但是如果客户端迟迟不发送确认报文,导致连接超时,不会带来脏数据
四次挥手
四次挥手具体过程是什么?
- 客户端想要关闭连接,传递FIN信号给服务端
- 客户端进入wait1状态
- 服务端应答了客户端,发送了ACK
- 告诉客户端可以断开,但是你要等我处理完数据
- 服务端进入close_wait状态
- 客户端发送服务端的确认报文后会进入wait2状态
- 服务端处理完数据,发送FIN信号
- 服务端进入了last_ack状态
- 客户端给服务端发送确认报文
- 客户端进入time_wait状态
- 服务端进入close状态
- 客户端经过2倍的MSL时间后,进入close状态
为什么需要四次挥手?
其实,我们可以把三次握手先看成次四次握手。
因为在握手中,我们可以将确认报文和SYN信号一起发送过去,合二为一。
但是挥手却不可以,因为这个过程客户端发送FIN信号后,虽然不可以发送数据,但是还可以接收服务端的数据。所以,不能合并。
为什么要等到2倍的MSL时间而不是直接关闭?
MSL表示报文最大的生存时间,即任何报文在网络上存在的最长时间,超过这个时间就会被丢弃
确保服务端成功接收到ACK报文
假设碰到最坏的情况,服务端没有接收到ACK报文,服务端就需要重新发送SYN(一个MSL),服务端接收ACK(一个MSL)
因此客户端为了确保对方能够收到ACK报文,所以必须要等待两被的MSL,然后关闭。
确保新连接不接受过期数据包
假设网络中有一个迟到的数据包,没有被服务端接收
断开连接后,客户端又在相同的端口与服务器进行了一个新的连接
那这个时候,迟到的数据包达到了服务端,服务端以为是新的客户端发送过来的消息。
那么通过,经过2倍的MSL足足可以让两个方向上的数据包都被丢弃
之后,建立的新连接就不过接收过期的数据包了
如果对你我帮助记得给我一个推荐或点赞哦
参考:
- (码出高效:Java开发手册)
- https://www.bilibili.com/video/BV1C5411Y7dG
- https://www.zhihu.com/question/50584054?sort=created
TCP的握手和挥手的更多相关文章
- 关于TCP的握手与挥手-----简单解释
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...
- TCP的握手与挥手
轻轻的TCP走了,正如TCP轻轻的来,TCP挥一挥手,传递了不知多少信息 看到哪,记到哪,想起哪,就看哪,这就是我的博客园,很随性 ---------------------------------- ...
- TCP 握手和挥手图解(有限状态机)
1.引言 TCP 这段看过好几遍,老是记不住,没办法找工作涉及到网络编程这块,各种问 TCP .今天好好整理一下握手和挥手过程.献给跟我一样忙碌,找工作的童鞋,欢迎大神批评指正. 2.TCP 的连接建 ...
- TCP/IP握手协议
转自:http://www.js123.net/t/n/n/2013/4/28/n_272.shtml 这篇介绍的也很棒:http://www.cnblogs.com/rootq/articles/1 ...
- 两将军问题、拜占庭将军问题、TCP三路握手过程的联系
2015年初时产生了一个疑问:基于不可靠的通信链路,为什么在两将军问题中永远无法达到共识,而在TCP三路握手中可以? 今天抽出了一些时间进行研究发现,实际上TCP三路握手也不是完全可靠的,只是一个近似 ...
- TCP模型,控制标志,握手,挥手,长连接*
1. TCP协议 Transmission Control Protocol,传输控制协议 面向连接的协议 需要三次握手建立连接 需要四次挥手断开连接 TCP报头最小长度:20字节 2.模型图 3.T ...
- TCP/IP 3握手4挥手
转:摘自<图解TCP/IP>P204 三次握手与四次挥手的状态转移图如下: 如图,由于第二次握手接收端发送SYN+ACK信号所以握手只用了三次,挥手由于接收端ACK和FIN分两次发的,所以 ...
- UNP——第二章,TCP握手与挥手分析
1.握手 说明: 下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发, 涉及 accept, listen 之类api,都是 应用进程 完成. 都统一使用 客户端,服务端描述,请自行分辨 ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...
随机推荐
- 在 .NET 中使用 Flurl 高效处理Http请求
简介 官方介绍,Flurl是一个现代的,流利的,支持异步的,可测试的,可移植的,URL增强和Http客户端组件. Url构建 现在有一个登录的接口,地址如下: https://www.some-api ...
- [unknown source] 快乐树
一.题目 题目描述 有一棵 \(n\) 个节点的数,每个点有点权 \(a_i\),定义一条路径的权值为路径上所有点的异或和,求所有路径的权值和,有 \(q\) 次修改,每次改一个点的点权. 数据范围 ...
- visual studio 2019 + cmake 实现windows linux跨平台开发环境搭建
visual studio 2019开始支持cmake跨平台开发. 以前cmake项目需要先生成vs项目,然后vs直接使用vs项目开发.现在可以直接用vs2019创建或打开cmake项目. 使用vis ...
- BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...
- Codeforces 1015E1 Stars Drawing (Easy Edition)
题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...
- Tex中的引号(JAVA语言)
package 第三章; import java.util.Scanner; public class Tex中的引号 { public static void main(String[] args) ...
- Git代码版本控制流程
我们的项目使用Git作为代码仓库.和版本控制工具. Git有几种Workflow,来管理代码版本变更流程,我们采用Gitflow Workflow流程. Gitflow Workflow,采用了mas ...
- 使用 Android Studio 开发 widget 安卓桌面插件
•What AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序: 这么说可能有点抽象,看图: 像这种,桌面上的天气.时钟.搜索框等等,都属于 APP Wi ...
- JS实现鼠标点击爱心&绘制多边形&每日一言功能
本篇文章主要介绍我的个人博客 程序猿刘川枫 中页面使用的美化功能(基于JS实现): 1.鼠标点击出现不同颜色爱心特效 2.页面浮动多边形跟随鼠标移动 3.每日一言功能 1.鼠标点击出现爱心特效 经常在 ...
- ES9的新特性:正则表达式RegExp
简介 正则表达式是我们做数据匹配的时候常用的一种工具,虽然正则表达式的语法并不复杂,但是如果多种语法组合起来会给人一种无从下手的感觉. 于是正则表达式成了程序员的噩梦.今天我们来看一下如何在ES9中玩 ...