IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 传输层TCP协议:TCP三次握手,四次挥手? -> 正文阅读

[网络协议]传输层TCP协议:TCP三次握手,四次挥手?

TCP 协议三次握手

TCP 协议是一个传输层协议提供Host-To-Host数据的可靠传输支持全双工,是一个连接导向的协议

主机到主机(Host-To-Host)

TCP提供的是Host-To-Host的传输,一台主机通过TCP发送数据给另一台主机。
主机是抽象概念(手机,平板,电脑等,收发数据设备都是主机)
请添加图片描述

TCP往上是应用到应用的协议,什么是应用到应用的协议呢?比如微信发信息给张三,微信客户端与服务都是应用,微信有自己的聊天协议,微信的聊天协议是应用到应用的协议;如果微信的聊天协议想要工作,就需要一个主机到主机的协议帮助它实现通信。

TCP上层有太多应用,不仅微信,还有原神,抖音,网易云音乐。。。。。。。因此TCP上层应用协议使用TCP能力的时候,需要告知TCP是哪个应用—这就是端口号。端口号用于区分应用。

TCP要实现主机到主机通信,就需要知道主机们的网络地址(IP地址),但是TCP不负责地址到地址(Address-To-Address)的传输,因此TCP协议把IP地址给底层的网络层层处理。

网络层,提供地址到地址的通信,IP就在这一层工作,解决地址到地址(Address-To-Address)的传输,但是不负责信号在具体两个设备传递,因为网路层会调用下方的数据链路层在两个相邻设备间传递信息。当两个信号设备间传递的时候,科学家又设计出了物理层封装最底层的物理设备,传输介质等,由最下方的物理层提供最底层的传输能力。

以上5层架构,我们成为互联网协议群,也成TCP/IP协议群.

主机到主机(Host-To-Host)为应用提供应用间的通信的能力。

什么是链接和会话?

链接是数据传输双方的契约

链接是通信双方的一个约定,目标是两个通信的程序之间产生一个默契,保证两个程序都在线,而且尽快的相应对方的请求,这就是链接。

设计上,链接是一种传输数据的行为,传输之前,建立一个链接。
数据收发双方在内存中都建立一个用于维护数据传输转态的对象,比如双方IP和端口号是多少?现在发送了多少数据了?状态健康吗?传输速度如何?等。所以链接是网络行为的记录。

会话,是应用的行为

比如微信里的张三和你聊天,那么张三和建立一个会话。你要和张三聊天,你们创建一个聊天窗口,这个就是会话。你和微信服务器建立一个连接,如果你们聊了一会各自休息了,约定先不要关微信,1个小时后在回来,那么连接会断开,因为聊天窗口没关,所以会话还在。

在有些系统设计中,会话自动重连(也就是重新建立连接),或者帮助创建连接。此外会话也负责多次连接中保持状态,比如HTTP Session 在多次HTTP请求间保持状态(r如用户信息)。

会话是应用层的概念,连接是传输层的概念。

双工/单工问题

数据单向发送–单工,单工至少一条线路。如果在某个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行,叫做半双工;半双工至少一条线路。如果任何时刻都数据都可以双向收发就是—双全工,双全工需要大于1条线路。

TCP 是一个双工协议,数据任何时候都可以双向传输。 这就意味着客户端和服务端可以平等地发送,接受信息,正因为如此,客户端和服务端在TCP协议中有一个平等的名词–Host(主机)。

什么是可靠性?

可靠性是保证数据无损传输

如果发送方按照数据发送,然后数据无序地在网上间传递,就必须有一种算法在接收方将数据恢复到原有的顺序。另外如果发送方同时要把信息发送给多个接收方,这种情况叫做多播,如果有一个消息到达任意接收者,那么所有接收者都必须收到这个消息。

TCP 的握手和挥手

TCP 是一个连接导向的协议,设计有建立连接(握手)和断开连接(挥手)的过程,TCP没有设计会话(Session),因为会话通常是一个应用的行为。

TCP的基本操作

  • 如果一个Host主动向另一个Host发起连接,成为SYN(Synchronization),请求同步。
  • 如果一个Host 主动断开请求成为FIN(Finish)请求完成。
  • 如果一个Host给另外一个Host 发送数据,成为PSH(Push)数据推送

以上3中情况,接收方收到数据后,都需要给发送方一个ACK(AcknowIedgement)响应。请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重复这个请求。

建立连接的过程(三次握手)

因为要保持连接和可靠性的约束,TCP协议要保证每一条发出的数据必须给返回,返回数据叫作ACK(响应)

按照这个思路,可以看看建立连接是不是需要三次握手
请添加图片描述

  1. 客户端发送消息给服务端(SYN)
  2. 服务端准好进行连接
  3. 服务端针对客户端的SYN给一个ACK

疑问??到这里不就可以了吗?2次握手就足够了,但其实不是,因为服务端还没有确定客户端是否准备好了,比如步骤3之后,服务端马上给客户端发送数据,这个时候客户端可能还没有准备好接收数据,因此还需要增加一个过程。
接下来的操作
4.服务端发送一个SYN给客户端
5.客户端准备就绪
6.客户端给服务端发送一个ACK

你可能会问上面不是6个步骤吗?怎么是三次握手?

  • 步骤1是1次握手
  • 步骤2是服务端准备就绪,不是数据传输,不算握手
  • 步骤3和4同时发生,可以合并成一个SYN+ACK,作为一条数据传输给客户端,所以算2次握手
    -步骤 5不算握手
  • 步骤6 是第三次握手

步骤3和步骤4,简洁版的图
请添加图片描述

断开连接过程(4次挥手)

  1. 客户端要求断开连接,发送一个断开请求,这个叫作(FIN)
  2. 服务端收到请求,然后给客户端一个ACK,作为FIN的响应
  3. 这里思考一下,可不可以像握手那样马上传FIN回去?
    其实这个时候服务端不能马上传FIN,因为断开连接要处理的问题比较多,比如说服务端发送出去的消息没有得到ACK,也有可能服务端自己有资源要释放,因此断开连接不能像握手那样操作–将两天消息合并。所以服务端经过一个等待,确定可以关闭连接了,在发一个FIN给客户端。
  4. 客户端收到服务端的FIN,同时客户端也可能有自己的事情需要处理完,比如客户度要发送给服务端没有收到AC看的请求,客户端自己处理完成后,再给服务端发送一个ACK。请添加图片描述

总结

  1. TCP提供连接,让双方的传输更加稳定,安全
  2. TCP没有提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双方的聊天记录,电商程序会话在保持购物车,订单一致,所以会话通常在TCP连接上进一步封装,在应用层提供。
  3. TCP 是一个面向连接的协议,说的就是TCP协议参与的双方Host 在收发数据之前会先建立连接。那UDP协议是一个面向报文的协议—协议双方不需要建立连接,直接传送报文(数据)。
  4. 最后,连接需要消耗更多的资源,比如在传输数据前,必须先协商建立连接。因此不是每一种场景都应该用连接导向的协议,像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧,客户端都需要给服务端一次相应这是不合理的。

关联的面试题:TCP为什么3次握手,4次挥手

TCP是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送SYC(同步请求)和ACK(响应)
握手阶段双方都没有繁琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的ACK和SYN打包作为一条消息回复,因此三次握手需要三次数据传输。

到了挥手阶段,双方都有可能未完成的工作,收到挥手请求的一方,必须马上响应(ACK)表示接收到了挥手请求。类比现实世界中,你收到offer,处于礼貌你先回复一下考虑一下,然后思考一段时间在回复HR最后的结果。最后等所有工作结束 ,在发送请求中断连接(FIN),因此4次挥手。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:35:20  更:2021-07-22 14:36:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 12:55:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计