当前位置: 首页 > news >正文

计算机网络之TCP的三次握手和四次挥手

一.有关TCP协议的几个概念

    1.1TCP协议的基本概念:

    TCP协议是传输层的一个协议,它支持全双工通信,是主机对主机之间数据的可靠传输,是一个连接导向的协议。

   1.2连接:

        连接是通信双方的一个约定,它的目的是让两个在通信的程序之间产生一个默契,保证两个通信的程序都在线,并且尽快地响应对方的请求。连接是记录网络的行为状态,是在传输层的一个概念。

   1.3会话:

        会话是应用的行为,比如说在微信上,你约定和张三聊天,聊了一段时间之后各自先不发送信息了,但是微信聊天窗口没有关闭。所以这个时候,连接关闭了,会话没有关闭。所以会话是在应用层的概念。

   1.4单工通信:

         如果在任何一个时刻,数据只能单向传送,这就是单工,单工通信至少需要一条线路;

   1.5半双工通信:

         如果在某个时刻,数据可以向一个方向进行传输,也可以向另外一个方向进行传输,并且交替进行,就叫作半双工,至少需要一条线路;

   1.6双工通信:

         如果在任意一个时刻,数据都可以双向收发,这就叫做全双工,全双工通信需要大于一条线路。

二.TCP的三次握手

       TCP协议的三次握手发生在建立连接的过程。先用一个大致的流程图表示一下三次握手的大致过程。

在上述表示的过程中,SYN在协议头中表示的是发起一个新连接,ACK是确认序号有效。可以看到,在上述的建立连接的过程中,有三次数据之间的互相传输,所以被称作为三次握手。

我们可以分析一下,在这三次握手的过程中,客户端和服务端分别都做了什么:

第一次握手:客户端给服务端发送一个建立连接的SYN报文,主动打开连接。第一次握手确保客户端发送报文的能力正常。

第二次握手:服务端如果同意连接,先生成一个ACK确认报文,确认从客户端接受到的报文无误,然后发送一个SYN报文给客户端,第二次握手是确保服务端接收和发送能力正常。

第三次握手:客户端接收到服务器端的确认信息后,还要给服务器发送确认报文。此时TCP连接建立,确认客户端接收能力正常。

三:TCP为什么需要三次握手

           如果TCP协议只采用两次握手会出现以下情况,客户端向服务端发送的请求报文由于网络延迟或者其他原因,没有及时成功地发送到服务端,这是,客户端会再次向服务端发生请求报文,在此之后,由于网络通畅了,连接释放,与服务器端建立了连接,第一次客户端发送的报文也会发送到服务端,但是,第一次发送的报文本该失效了,服务端以为客户端又重新发送了一次请求,两次握手建立连接,客户端忽略服务端的确认报文就建立连接,也不会给服务端发送数据,就会造成不必要的网络资源浪费。

           所以,当TCP采用三次握手来建立连接时,就算第一次失效的报文请求发送给服务端,服务端发送确认报文给客户端,但是服务端没有接收到客户端第三次握手的确认报文,就会知道客户端没有建立连接,就会避免两次握手所造成的问题。

四.TCP的四次挥手

     TCP协议的四次挥手发生在断开连接的过程,先用一个大致的流程图来表示一下四次挥手的过程。

     

下面我们分析一下,在这四次挥手中,客户端和服务端分别都做了什么

第一次挥手:客户端给服务端发送一个 FIN数据包,主动断开连接,告诉服务器我要和你断开连接了,不会再给你发送数据了;此时客户端还是可以接受数据的,如果一直没有接受到被动连接方的确认包,则可以重新发送FIN数据包。

第二次挥手:服务端接收到FIN数据包之后,向客户端发送ACK确认包,表示已经收到客户端发送的报文了,这个时候,服务器在向客户端传达一个信息:我知道你要断开连接了,但是我的数据还没有发送完,等我发送完之后就会进行第三次挥手。

第三次挥手:服务端向客户端发送FIN数据包,告诉客户端我的数据发送完了,不会再给你发送数据了。

第四次挥手:客户端收到FIN数据包之后,同样的会发送一个ACK确认报文,到达服务端之后,客户端进入CLOSED状态。

五.TCP为什么需要四次挥手

         当客户端向服务端发送FIN数据包表示断开连接时,这仅仅表示客户端不再发送数据了,但是客户端还是能够接收数据。当服务端接收到客户端的FIN报文时,它首先会回复一个ACK应答报文,然而,服务端可能还有数据需要处理和发送,所以直到服务端不再发送数据的时候,才会发送FIN报文给客户端,表示同意关闭连接。

        从上述描述的过程可以看出,服务端通常会把ACK和FIN报文分开发送,所以才会有四次挥手的过程。

六.总结

        TCP是一个全双工协议,保证双方的传输更加稳定和可靠。为了让双方都保证建立连接的时候,连接的双方都需要向对方发送SYC(同步请求)和ACK(响应)。在建立连接的时候,双方都没有繁琐的工作,所以在被建立连接的一方可以将自己的ACK和SYN作为一条信息回复,因此需要三次握手。在断开连接的时候,因为需要等被断开连接的一方把数据都处理完,所以被断开连接的一方需要分别发送ACK和FIN,因此需要四次挥手。

        

相关文章:

  • webpack 中 require.context() 的用法
  • 力扣刷题笔记
  • Redis连接池配置:深入探索JedisPoolConfig
  • create-react-app创建的项目中设置webpack配置
  • 【科技前沿】电子设计新贵SmartEDA:为何它引领行业风潮?
  • 物联网 IoT 收录
  • 等保测评练习10
  • 程序员系统入门大模型的路径和资源,看这篇就够了
  • 道路救援小程序源码
  • 把sql拿到数据库中执行,和程序返回的值不一样??????
  • 深度学习工具jupyter的new没有环境选项以及遇到的EnvironmentLocationNotFound:Not such a environment
  • Nginx实现动静分离
  • 赋能AI未来,景联文科技推出高质量亿级教育题库、多轮对话以及心理大模型数据
  • 信息检索(53):Document Expansion by Query Prediction
  • Spring框架学习笔记(本地印象笔记搬运)(整理中)
  • es6要点
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS小技巧之UIImagePickerController实现头像选择
  • js学习笔记
  • Mysql优化
  • PHP 小技巧
  • scala基础语法(二)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Twitter赢在开放,三年创造奇迹
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于Java中分层中遇到的一些问题
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用 QuickBI 搭建酷炫可视化分析
  • 双管齐下,VMware的容器新战略
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微服务框架lagom
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​configparser --- 配置文件解析器​
  • #Lua:Lua调用C++生成的DLL库
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (九)信息融合方式简介
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET Core 版本不支持的问题
  • .NET Core中Emit的使用
  • .NET 常见的偏门问题
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 的程序集加载上下文
  • .net 微服务 服务保护 自动重试 Polly
  • .NET运行机制
  • [ C++ ] STL---仿函数与priority_queue
  • [@Controller]4 详解@ModelAttribute
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略