当前位置: 首页 > 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,因此需要四次挥手。

        

http://www.lryc.cn/news/381933.html

相关文章:

  • JupyterLab使用指南(八):更改JupterLab左侧默认打开目录
  • Android SurfaceFlinger——HWC Adapter初始化(五)
  • 泛微开发修炼之旅--17基于Ecology短信平台,实现后端自定义二开短信发送方案及代码示例
  • SpringMVC系列二: 请求方式介绍
  • 大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展
  • C# 关于通讯观察线程(1) -- 开启通讯线程
  • 15.树形虚拟列表实现(支持10000+以上的数据)el-tree(1万+数据页面卡死)
  • 【服务器07】之【GitHub项目管理】及【Unity异步加载场景】
  • ansible提权之become_method与become_flags详解
  • elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
  • 基于图扑 HT for Web 实现拓扑关系图
  • linux笔记10--编辑器之神VIM
  • 安全管理中心-集中管控(6点)
  • 使用electron打包Vue前端项目的详细流程
  • 《计算机英语》 Unit 4 Information Management 信息管理
  • 如何打包数据库文件
  • iOS抓包指南 正则过滤爬取
  • FLASH仿真EEPROM---基于智芯Z20K11XM
  • 阿里云PAI大模型评测最佳实践
  • 应用图扑 HT for Web 搭建拓扑关系图
  • Django Aggregation 使用指南
  • 嵌入式学习——Linux操作系统——文件编程练习
  • 用JavaScript实现了一个简单的图像坐标点标注工具
  • Pytorch深度解析:Transformer嵌入层源码逐行解读
  • HSP_10章 Python面向对象编程oop_基础部分
  • JavaWeb系列十七: jQuery选择器 上
  • Gone框架介绍30 - 使用`goner/gin`提供Web服务
  • Lipowerline5.0 雷达电力应用软件下载使用
  • STM32学习之一:什么是STM32
  • AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!