三次握手

三次握手具体过程是什么?

  1. 客户端发送一个数据包

    • 将SYN置成1,表示希望建立连接

    • 这个包中的序列号是X

  2. 服务器收到客户端发来的数据包

    • 通过SYN得知这是一个建立连接的请求

    • 于是发送一个响应包

    • 并将SYN和ACK标志成1,

    • 假设发送包的序列号是是y

    • 确认序列号必须是x+1,表示收到了客户端发来的SYN请求

  3. 客户端收到服务端的响应包后需要进行确认

    • 确认包中将ACK置为1,并将确认序列号设置为y+1。表示收到了服务端的SYN请求

为什么需要第三次握手?

主要是要两个目的:信息对等防止超时

信息对等

防止超时

即防止出现请求超时,导致脏连接。假设发生了下面的情况:

  • 客户端发送第一个请求,但是请求超时,报文依旧在网络上传输
  • 客户端发送了第二个请求,服务端成功接收到了
  • 服务端发送确认报文,连接成功
  • 传输数据完后,释放连接(两者就都不是SYN_CENT状态)
  • 之后,超时请求到达服务端,然后服务端接收,建立脏连接
  • 因为客户端不是SYN_CENT状态,直接丢弃服务端的确认报文,导致只有服务端单方面建立连接

如果是三次握手的情况,服务端即使收到了超时请求报文,但是如果客户端迟迟不发送确认报文,导致连接超时,不会带来脏数据

四次挥手

四次挥手具体过程是什么?

  1. 客户端想要关闭连接,传递FIN信号给服务端

    • 客户端进入wait1状态
  2. 服务端应答了客户端,发送了ACK
    • 告诉客户端可以断开,但是你要等我处理完数据
    • 服务端进入close_wait状态
    • 客户端发送服务端的确认报文后会进入wait2状态
  3. 服务端处理完数据,发送FIN信号
    • 服务端进入了last_ack状态
  4. 客户端给服务端发送确认报文
    • 客户端进入time_wait状态
    • 服务端进入close状态
  5. 客户端经过2倍的MSL时间后,进入close状态

为什么需要四次挥手?

其实,我们可以把三次握手先看成次四次握手。

因为在握手中,我们可以将确认报文和SYN信号一起发送过去,合二为一。

但是挥手却不可以,因为这个过程客户端发送FIN信号后,虽然不可以发送数据,但是还可以接收服务端的数据。所以,不能合并

为什么要等到2倍的MSL时间而不是直接关闭?

MSL表示报文最大的生存时间,即任何报文在网络上存在的最长时间,超过这个时间就会被丢弃

确保服务端成功接收到ACK报文

假设碰到最坏的情况,服务端没有接收到ACK报文,服务端就需要重新发送SYN(一个MSL),服务端接收ACK(一个MSL)

因此客户端为了确保对方能够收到ACK报文,所以必须要等待两被的MSL,然后关闭。

确保新连接不接受过期数据包

假设网络中有一个迟到的数据包,没有被服务端接收

断开连接后,客户端又在相同的端口与服务器进行了一个新的连接

那这个时候,迟到的数据包达到了服务端,服务端以为是新的客户端发送过来的消息。

那么通过,经过2倍的MSL足足可以让两个方向上的数据包都被丢弃

之后,建立的新连接就不过接收过期的数据包了

如果对你我帮助记得给我一个推荐或点赞哦

参考:

TCP的握手和挥手的更多相关文章

  1. 关于TCP的握手与挥手-----简单解释

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...

  2. TCP的握手与挥手

    轻轻的TCP走了,正如TCP轻轻的来,TCP挥一挥手,传递了不知多少信息 看到哪,记到哪,想起哪,就看哪,这就是我的博客园,很随性 ---------------------------------- ...

  3. TCP 握手和挥手图解(有限状态机)

    1.引言 TCP 这段看过好几遍,老是记不住,没办法找工作涉及到网络编程这块,各种问 TCP .今天好好整理一下握手和挥手过程.献给跟我一样忙碌,找工作的童鞋,欢迎大神批评指正. 2.TCP 的连接建 ...

  4. TCP/IP握手协议

    转自:http://www.js123.net/t/n/n/2013/4/28/n_272.shtml 这篇介绍的也很棒:http://www.cnblogs.com/rootq/articles/1 ...

  5. 两将军问题、拜占庭将军问题、TCP三路握手过程的联系

    2015年初时产生了一个疑问:基于不可靠的通信链路,为什么在两将军问题中永远无法达到共识,而在TCP三路握手中可以? 今天抽出了一些时间进行研究发现,实际上TCP三路握手也不是完全可靠的,只是一个近似 ...

  6. TCP模型,控制标志,握手,挥手,长连接*

    1. TCP协议 Transmission Control Protocol,传输控制协议 面向连接的协议 需要三次握手建立连接 需要四次挥手断开连接 TCP报头最小长度:20字节 2.模型图 3.T ...

  7. TCP/IP 3握手4挥手

    转:摘自<图解TCP/IP>P204 三次握手与四次挥手的状态转移图如下: 如图,由于第二次握手接收端发送SYN+ACK信号所以握手只用了三次,挥手由于接收端ACK和FIN分两次发的,所以 ...

  8. UNP——第二章,TCP握手与挥手分析

    1.握手 说明: 下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发, 涉及 accept, listen 之类api,都是 应用进程 完成. 都统一使用 客户端,服务端描述,请自行分辨 ...

  9. 抓包分析 TCP 握手和挥手

    前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...

随机推荐

  1. 建立高速缓存机制-java版

    前言 ​ 一台计算机的核心是CPU,它是计算机系统的运算和控制核心.由于它处理运算速度快,所以基本都会给CPU配置一级缓存,当CPU要读取一个数据时,首先从缓存中查询,如果没有在从内存或者磁盘块中找. ...

  2. python多线程参考文章

    1. https://www.jianshu.com/p/c93e630d8089 2.https://www.runoob.com/python/python-multithreading.html ...

  3. 练习1—参数传递、递归调用(Java)

    1.方法参数的值传递机制 1.说明 方法:必须由其所在类或对象调用才有意义.若方法含有参数: 形参:方法声明时的参数: 实参:方法调用时实际传给形参的参数值 Java的实参值如何传入方法:Java里方 ...

  4. Radar Scanner Gym - 102220G

    题目链接:https://vjudge.net/problem/Gym-102220G 题意:在水平直角坐标系中有n个矩形,你可以将矩形沿着平行于X轴和Y轴水平移动,问至少经过几次移动可以使得所有的矩 ...

  5. 【LeetCode】2020-03 每日一题

    121. 买卖股票的最佳时机(简单) [分类]:模拟.思维 [题解]:可以用O(n)的复杂度完成,只需要在遍历的时候记录到当前位置为止买入股票的最小价格minn,再维护一个当前卖出股票价(a-minn ...

  6. c++ 反汇编 局部静态变量

    vs2017下测试 34: for (int i = 0; i < 5; i++) 0029734E C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0 0 ...

  7. 攻防世界 csaw2013reversing2 CSAW CTF 2014

    运行程序 flag显示乱码 IDA打开查看程序逻辑 1 int __cdecl __noreturn main(int argc, const char **argv, const char **en ...

  8. 【小白学算法】5.链表(linked list)、链表的添加

    链表其实也就是 线性表的链式存储结构,与之前讲到的顺序存储结构不同. 我们知道顺序存储结构中的元素地址都是连续的,那么这就有一个最大的缺点:当做插入跟删除操作的时候,大量的元素需要移动. 如图所示,元 ...

  9. LinkedList源码个人解读

    LinkedList的基本结构是双向链接的直线结构. 链表的构造函数有两个,其中空构造函数什么都没做,就是一个空实现. /** * Constructs an empty list. */ publi ...

  10. 【软件推荐】使用Cmder替换Windows自带的控制台

    安装地址 进入cmder官网,下载相应版本. 如果本地已经安装了git,可以选择mini版本. 将 λ 替换为 $ 当前cmder默认的提示符是λ,看上去总是有点不习惯. 打开cmder目录下的ven ...