首页 > 其他分享 >03. TCP的3次握手4次挥手

03. TCP的3次握手4次挥手

时间:2023-10-27 20:24:41浏览次数:34  
标签:03 挥手 ACK 握手 SYN TCP 服务器 数据包 客户端

一、三次握手

  TCP 是稳定的传输方式,在接收、发送之前,双发需要建立一个虚拟的通道,这个过程称为 3 次握手。3 次握手的流程如下:

三次握手

  1. 客户端调用 connect() 时发送一个带有标记的数据包,我们把建立连接时的第 1 次数据叫做 SYN,其中由 1 个数字;
  2. 服务器接收到这个 SYN 数据包,提取出数字,然后 +1,回送给客户端。这个数据包中有 2 部分:SYN + ACK;
    1. ACK 是对接收到的数据的确认;
    2. SYN 表示要向客户端发送的数据;
  3. 当客户端接收到 SYN + ACK 数据包之后,提取数字,然后加 1,然后用 ACK 数据包回送给服务器;

当客户端调用 connect() 方法的时候,就有了 TCP 的 3 次握手,目的是让双方都分配一些资源(内存等)为将来进行网络通信时做准备;

服务器会阻塞到 accept() 方法这里,直到客户端发起连接,即 3 次握手完成之后,accept() 才会解阻塞,并且 accept() 返回一个新的套接字还有刚刚连接成功的 IP 和 PORT;

二、四次挥手

  为了释放资源,所以双方需要协商怎样关闭这个虚拟的通道,这就是 4 次挥手。4 次挥手的过程如下:

四次挥手

  1. 客户端先发送一个数据包,这里有 1 个数字,4 次挥手开始的第 1 次数据包称为 FIN;
  2. 服务器接收到 FIN 数据包,然后将数字提取出来,然后 +1,通过 ACK 数据包发送给客户端;
    1. 此时服务器的 recv() 会解阻塞,并且返回的数据长度为 0;
    2. 如果服务器对已经建立的套接字调用 close(),那么就会有下面的 2 次挥手;
  3. 服务器发送一个数据,这里有 1 个数字,这个包类型是 FIN;
  4. 当客户端接收服务器的 FIN 时,提取出数字,然后 +1,然后用 ACK 数据包回送给服务器;

当客户端调用 close() 方法时,操作系统会发起 TCP 的 4 次挥手;

当服务器调用 close() 方法时,才会发送第 3 次挥手数据;

标签:03,挥手,ACK,握手,SYN,TCP,服务器,数据包,客户端
From: https://www.cnblogs.com/kurome/p/17793072.html

相关文章

  • day 3 链表 203.移除链表元素、707.设计链表、206.反转链表
    203.移除链表元素题目链接:203.移除链表元素视频教程文字教程虚拟头节点虚拟头节点的目的:消除头节点的特殊性痛点:删除头节点和删除其他节点的操作是不一样的,导致写代码时需要分两种情况考虑因为其他链表都是通过前一个节点删除的而头节点没有前一个节点,只需将头节点向......
  • Python:爬取某软件站数据报错requests.exceptions.SSLError: HTTPSConnectionPool(hos
    使用Python爬取某网站数据时候,之前一直是好好的。突然就报错:requests.exceptions.SSLError:HTTPSConnectionPool(host='api.***.cn',port=443):Maxretriesexceededwithurl:/accounty1/login?analysis............检查发现,可能是IP地址存在代理导致网络环境一场。可以检......
  • CF248E Piglet's Birthday
    提前了一个月,就做掉了这题,不过还是庆祝一下吧。(考虑dp。令\(f_{u,i}\)表示货架\(u\)还剩\(i\)罐未被吃的蜂蜜的概率。答案就是\(\sumf_{u,0}\)。考虑一次修改\(u\tov\),由于被移动的蜜罐都被吃了,所以\(v\)的\(f\)数组不变,只需要考虑\(f_u\)的变化。枚举吃掉了......
  • 用springBoot、netty写TCP客户端/服务端,并用TCP工具测试
    1.启动客户端和连接服务端packagecom.pkx.cloud.test.netty;importio.netty.bootstrap.Bootstrap;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioSock......
  • 2023-10-27 Module not found: Error: Can't resolve 'D:/xx/xx/src/pages/yyy/zzz' i
    问题描述:react+antd+umi业务中删掉了一个文件夹,重新编译报错。报错:在'D:\xx\xx\src\.umi\core'路径里面无法找到模块zzz。原因:是因为你只是把本地文件zzz给删了,但是在route.js里面还保留着它的路径,所以umi识别不到就报错了。解决方案:在route.js文件里找到zzz的路径,将之删掉再重......
  • 'main' attribute cannot be used in a module that contains top-level code 问题解
    核心是@main注解在main.swift文件中,可以重新命名下参考资料https://stackoverflow.com/questions/73431031/swift-cli-app-main-attribute-cannot-be-used-in-a-module-that-contains-top-leve......
  • 代码随想录第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    第一题:https://leetcode.cn/problems/remove-linked-list-elements/我一开始打算是搞先判断第一个节点是不是,如果不是就作为头节点来着,不过后来一想觉得太麻烦了,仔细一看题目发现居然已经提供了模拟头节点的方法,就用了呗GPT3.5:那你我的想法有颇多相似之处啊.jpg第二题:https://l......
  • TCP/IP协议族面面观
    TCP/IP协议族介绍及在C#中的使用什么是TCP/IP协议族?TCP/IP协议族是互联网最基本的网络协议族,它定义了互联网上设备之间进行通信的规范。TCP/IP协议族由多个协议组成,每个协议都有不同的功能和用途,下面我们将介绍其中一些常用的协议。TCP/IP协议族中的常用协议1.IP协议Interne......
  • CentOS7系统放行TCP/UDP端口教程
    在使用CentOS7操作系统时,您需要放行某些端口,以便应用程序能够正常运行。下面是如何放行TCP/UDP端口的步骤。步骤1:SSH连接服务器使用SSH方式连接服务器,如果您不知道如何SSH连接服务器,可以查看该教程:SSH远程连接Linux服务器教程步骤2:确定要放行的端口在放行端口之前,您需要确定要......
  • 记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析
    开心一刻昨晚和一个朋友聊天我:处对象吗,咱俩试试?朋友:我有对象我:我不信,有对象不公开?朋友:不好公开,我当的小三问题背景程序在生产环境稳定的跑着jarjar自己在开发环境也做了主流业务的测试,没有任何异常,稳如老狗提测之后,测试小姐姐也没测出问题,一切都是......