计算机网络:详解TCP协议(四次握手三次挥手)

目录

1.Tcp协议介绍

1.1 Tcp协议层级

1.2 TCP协议的格式

2. 确认应答机制

2.1 确认应答

2.2 序号字段

2.3 捎带应答

3. 流量控制

4. 三次握手 四次挥手

4.1 认识标志位

4.2 简单认识

4.3 三次挥手

4.4 四次挥手


1.Tcp协议介绍

1.1 Tcp协议层级

计算机网络:TCP/IP网络协议-CSDN博客

下面是TCP/IP网络协议族层级划分,TCP协议位于传输层。其中传输层和网络层都归属于操作系统层面。

TCP协议全称是传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。顾名思义,Tcp协议要对数据传输进行控制。

  • 如下图,用户从主机A发送消息,应用层通常需要对数据进行序列化。序列化是对某个数据结构按照特定格式组织称一条完整数据。而反序列化是将一条数据转按照特定格式转换成原来对应的数据结构。
  • 序列化后的数据通过write系统调用拷贝给TCP层中的发送缓冲区,每往下一层,都要加上对应的数据报头。
  • 之后,通过网络传输到主机B。先从物理层开始,对数据包进行解包分用。当到主机BTCP层的接收缓冲区,就会得到对方发来的序列化数据。通过read系统调用函数,读取缓冲区的数据,再进行反序列化,主机B的用户就会接受到发来的消息。

TCP协议对应的文件描述符是全双工的,既可以接收数据,也可以发送数据。因为TCP层中有两个缓冲区。数据从TCP的发送缓冲区传输到网络层,会在该数据前面加上TCP协议的报头,下面我们来了解一下TCP协议的格式。

1.2 TCP协议的格式

  1. 源/目的端口号:这两个端口号分别表示数据是从哪个进程来,到哪个进程去。它们用于识别发送方和接收方的应用程序。

  2. 32位序号/32位确认号:序号用于标识发送的数据段,确保数据的顺序。确认号用于确认接收到的数据段的序号,确保数据的完整性。

  3. 4位TCP报头长度:这个字段表示TCP头部有多少个32位(即4字节)。因此,TCP头部的最大长度是15 * 4 = 60字节。

  4. 6位标志位:这些标志位用于控制TCP连接的状态和传输方式。

    • URG:表示紧急指针是否有效。
    • ACK:表示确认号是否有效。
    • PSH:提示接收端应用程序立即从TCP缓冲区读取数据。
    • RST:对方要求重新建立连接,携带RST标识的称为复位报文段。
    • SYN:请求建立连接,携带SYN标识的称为同步报文段。
    • FIN:通知对方本端要关闭连接,携带FIN标识的称为结束报文段。
  5. 16位窗口大小:这个字段用于流量控制,表示接收方的缓冲区大小。

  6. 16位校验和:发送端填充,用于CRC校验。接收端通过校验和来验证数据是否正确。校验和不仅包含TCP首部,还包含TCP数据部分。

  7. 16位紧急指针:标识哪部分数据是紧急数据。

  8. 40字节头部选项:这部分暂时忽略。

总的来说,TCP协议的报头长度在20-60字节之间。

2. 确认应答机制

2.1 确认应答

确认应答机制是TCP协议保证可靠性中最重要的一环。

  • 主机A向主机B发送一条消息,主机A如何保证消息被主机B接收呢?主机B会向主机A发送确认消息。那么主机B怎么保证这条确认消息被主机A接收呢?主机A也会发送一条确认消息。
  • 如此循环下去,你会发现新发的消息永远得不到确认,也就是不可靠。但是历史消息会得到确认,所以说这里的可靠性是指对历史消息的确认。

2.2 序号字段

可是,这么多条历史消息,怎么保证收到的是哪一条消息。TCP将每个字节的数据进行编号,即为序列号。我们可以将tcp的接受缓冲区类比成一个大字符数组,那么每个字节的数据就有了下标,天然就有了编号。

主机A的发送缓冲区拷贝上层的数据,发送出去后,对方接受缓冲区直接一股脑接收到接收缓冲区,本质上就是拷贝数组上的数据。

上图中还是主机A和主机B进行通信。

  • 主机A发送的TCP报文中,有序号字段,表示发送数据的顺序。如果主机A报文中序号字段为1000,主机B接受到该条数据,会解析报文中的序号字段。
  • 之后,主机B会在组织应答报文时,将TCP报文中确认序号字段填上1001,表示1001序号之前的数据已经获取。即确认序号字段会填写主机收到最大序号数,并加一。

2.3 捎带应答

张三问:“李四今天吃了什么?”。李四回答:“叉烧炒蛋饭。你呢?”。在上面这段对话中,张三向李四发起问答,李四回答后,顺便向张三也发起问答。

 tcp通信类似于人类的对答机制。主机A和主机B类比于张三和李四。主机A发送一条消息给主机B,主机B接受到后,组织tcp报文,并填写确认序号字段,同时也携带数据,填写序号字段。

上图中,左边部分才是tcp通信的真实情况。这种机制就是捎带应答。这也是为什么会有确认序号字段的原因。

3. 流量控制

主机A发送大量数据给主机B,主机B的接受缓冲区已经满载了,无法接收新的数据。此时,主机B的操作系统只能丢弃新的tcp报文。不过tcp报文有超时重传机制,超过一定时间没收到确认应答报文,会重发tpc报文。

  • 可是这些被丢弃的tcp报文经过无数个路由器,经历千难万险,通过网络发送到目标主机。tcp报文不是需要保证可靠性吗?操作系统不会做浪费时间和空间的事情。
  • 主机中的接受缓冲区剩余空间大小决定能接受多少数据,所以只需要知道对方接收缓冲区剩余空间,就可以控制tcp报文携带的数据大小,做到流量控制。

但是任何主机如何知道目标主机的缓冲区剩余空间大小呢?tcp报文中有窗口大小字段,该字段表示本主机接受缓冲区剩余空间的大小。对方主机接受到tcp报文,解析该字段,便知道发送主机的缓冲区剩余空间大小,就可以控制发送的数据大小。

4. 三次握手 四次挥手

4.1 认识标志位

客户端向服务端发送tcp报文,不同的tcp报文通信的功能也不相同,可能是建立连接的请求,正常数据通信请求或者断开连接的请求。

其中ACK表示该报文有确认应答功能,SYN表示向目标主机建立连接,FIN表示要求断开连接。

4.2 简单认识

 在确认应答机制中,最新发出的一条消息无法保证是否被接收,但是历史消息能保证被接收,这就是确认应答机制的核心。

三次握手一般是由客户端发起连接请求,服务端收到连接请求后,给予确认应答,并捎带服务端的连接请求,最后客户端进行确认应答。

四次挥手一般是由客户端发起断开连接请求,服务端收到后回复。之后,再由服务端发起断开连接请求,客户端进行确认应答。

4.3 三次挥手

三次握手,本质上双方各自一次请求并接收对方应答,

  • 客户端调用connect函数建立连接时,操作系统就会自动组织tcp报文,发起连接请求,此时客户端tcp层处于SYN_SENT。
  • 服务端这边需要调用listen函数,处于监听状态,再调用accept函数给新连接分配新文件描述符,让新文件描述符用于客户端通信。此时,操作系统会发送确认应答和连接请求给对方。
  • 客户端收到后,便处于ESTABLISHED状态。客户端的操作系统也组织确认应答报文,发送给服务端,服务端接收到之后,也处于ESTABLISHED状态
  • 但是客户端发出最后一次的确认应答,是最新一条消息,这是无法保证可靠性,所以说客户端在赌最后一个ACK应答被服务端收到。

为什么要有三次握手?

  • 建立双方主机通信意识的共识
  • 因为TCP是全双工的,三次握手可以验证全双工通信的通畅性。

4.4 四次挥手

四次挥手中,也是双方的一问一答。

  • 先提出断开连接请求的那一方,状态会变成FIN_WAIT_1,接收到对方的断开连接请求的一方,状态会变成CLOSE_WAIT。
  • 假设客户端是先提出断开连接的一方,那么接收到断开连接的确认应答后,会变成TIME_WAIT状态。服务端过一会也想断开连接,也会发出断开连接请求。最后都变成CLOSED状态。
  • 但是在应用层上,其实是双方调用了close函数,关闭用于tcp通信的文件描述符。而tcp报文的组织和发送都是由操作系统自己完成的。
  • 至于为什么会有TIME_WAIT状态,先关闭那一方等待对方关闭连接请求而设置的状态,一般是两分钟。
  • 为什么要进行四次挥手呢?因为要关闭两个通信的文件描述符。

不过有些人可能会问,为什么不把中间的断开连接请求和确认断开连接应答合并,使用捎带应答机制,来完成挥手操作。

事实上,TCP协议确实存在通过三次通信完成连接终止的可能性。其关键在于能否实现"FIN-ACK捎带应答"机制——当被动关闭方收到主动关闭方的FIN报文后,如果此时应用层已完成数据处理并立即触发关闭流程,系统可以将ACK确认报文与己方的FIN结束报文合并发送。这种合并使得原本需要四次报文交互的过程(FIN→ACK→FIN→ACK)被优化为三次(FIN→ACK+FIN→ACK)。

但是多数情况下仍然需要完整的四次挥手流程。

最后这是双方正常tcp通信情况。


创作充满挑战,但若我的文章能为你带来一丝启发或帮助,那便是我最大的荣幸。如果你喜欢这篇文章,请不吝点赞、评论和分享,你的支持是我继续创作的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 IView WeappUI组件库(简单增删改查)

IView Weapp 微信小程序UI组件库:https://weapp.iviewui.com/components/card IView Weapp.png 快速上手搭建 快速上手.png iView Weapp 的代码 将源代码下载下来,然后将dict放到自己的项目中去。 iView Weapp 的代码.png 小程序中添加iView Weapp 将di…

用java实现一个简单的sql select 解析器,无需第三方依赖,完全从0开始

以下是一个简单的 SQL SELECT 解析器的 Java 实现,支持单表查询和基本条件过滤。代码包含词法分析和语法分析模块,并支持以下语法: SELECT column1, column2 FROM table WHERE column3 5 完整代码 1. Token 类型定义 (TokenType.java) pu…

阿里云 CentOS YUM 源配置指南

阿里云 CentOS YUM 源配置指南 在使用 CentOS 7 时,由于 CentOS 官方源停止维护等原因,yum install 命令可能会报错 “Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64”。以下是通过更换阿里云源解决该问题的详细步骤。 一、备份原有配…

Learning vtkjs之ThresholdPoints

过滤器 阈值过滤器 介绍 vtkThresholdPoints - 提取满足阈值条件的点 vtkThresholdPoints 是一个过滤器,它从数据集中提取满足阈值条件的点。该条件可以采用三种形式: 1)大于特定值; 2) 小于特定值; 3) 在特定值之间…

记录ruoyi-flowable-plus第一次运行流程报错

记录ruoyi-flowable-plus第一次运行流程报错 错误步骤 1.启动ruoyi-flowable-plus 正常登录后,打开流程分类然后点击新增按钮,新增了一个分类。增加成功后, 再点击流程分类,报错。 错误提示 org.springframework.cglib.core.C…

Java中的stream流介绍与使用

一、Stream 的基础概念 定义与特性 Stream 是单向数据流,对集合或数组进行高效处理,不存储数据,而是通过操作链生成新 Stream。不可变性:原始数据源不被修改,所有操作均返回新 Stream。延迟执行:中间操作&a…

OCR身份证识别(正反面)_个人证照OCR识别_开放API接口使用指南

一、接口简介 在数字化时代,快速准确地提取身份证信息变得尤为重要。**万维易源提供的“身份证OCR识别”API接口,能够快速提取二代居民身份证正反面的所有字段信息,包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限等。…

25年新版潮乎盲盒系统源码 盲盒商城系统前端分享

盲盒系统市场的前景一直都很不错,最近很多问我有没有盲盒源码的客户,下面给大家分享一个新版潮乎盲盒源码! 这款盲盒源码系统 前端Uniapp 后端使用了Laravel框架进行开发。Laravel是一个流行的PHP框架,具有强大的功能和易于使用的…

Transformer四模型回归打包(内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型)

Transformer四模型回归打包(内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型) 目录 Transformer四模型回归打包(内含NRBO-Transformer-GRU、Transformer-GRU、Transformer、GRU模型)预测效果基本介绍程序设计参…

Axure疑难杂症:利用中继器制作三级下拉菜单(逻辑判断进阶)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:三级下拉菜单 主要内容:条件筛选时的逻辑判断思维,中继器使用 应用场景:复合条件下的下拉列表制作 案例展…

Nginx 核心功能之正反代理

目录 一、Nginx 二、正向代理 三、反向代理 四、Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 五、Nginx rewrite和正则 (1)Nginx 正则 (2)nginx location (3)Rewrite &…

ssh连接云服务器记录

文章目录 1. 背景2. ssh连接2.1 win 下通过终端工具进行连接2.2 Linux下通过ssh指令连接2.3 ssh使用publickey来连接 ssh连接云服务器记录 1. 背景 最近开始接触docker技术、mysql技术,加上本人工作基本都在Linux下进行,因此需要一套Linux环境进行练习。…

软考-软件设计师中级备考 12、软件工程

一、软件工程概述 定义:软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及到软件的开发、测试、维护、管理等多个方面,旨在运用一系列科学方法和技术手段,提高软件的质量和开发效率,降低软件开…

【多次弹出“获取打开此tobiieyetracking链接的应用”的窗口】解决办法

使用联想R9000P突然出现“获取打开此tobiieyetracking链接的应用”的窗口,每隔几分钟就弹一次,特别恶心人,解决办法: 找到【此电脑】,鼠标右键【管理】;选择【服务】,如下所示,找到…

项目选择的三个核心因素:市场前景、竞争优势和成本控制

能保持持续增长和赚钱的项目就是好项目。 每个创业者创业之初,遇到的第一个难题就是选择做什么项目? 俗话说:方向不对,努力白费。 选错项目,意味着你所有的付出都是打水漂。 能做的项目那么多,在没有价值…

裸机 Kubernetes 集群负载均衡器:MetalLB 深度解析与实战指南

一、引言 在云原生架构中,Kubernetes 默认的负载均衡能力依赖于云厂商(如 AWS ELB、GCP LB),但在裸机或本地数据中心环境中,这一功能缺失导致 LoadBalancer 类型的 Service 始终处于 Pending 状态。此时,M…

2025年- H20-Lc128-240. 搜索二维矩阵 II(矩阵)---java版

1.题目描述 2.思路 遍历矩阵,然后如果遇到矩阵中的值正好等于target,输出true。否则,输出false。 3.代码 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.计算出总的行值,总的列值。int mm…

系统架构设计师:设计模式——行为设计模式

一、行为设计模式 行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。 行为类模式使用继承机制在类间分…

java springboot实现MCP Server SSE

参考: https://juejin.cn/post/7491881721278529570 SpringAI 实现 SSE MCP Server项目 - Auler - 博客园 springboot-MCPserver-JUnit: 使用springboot支持mcp项目搭建,同时有着便捷的单元测试来进行敏捷开发对话即服务:Spring BootMCP让…

LeetCode 热题 100 48. 旋转图像

LeetCode 热题 100 | 48. 旋转图像 大家好,今天我们来解决一道经典的算法题——旋转图像。这道题在LeetCode上被标记为中等难度,要求我们将一个 n n 的二维矩阵(图像)顺时针旋转90度,并且必须原地修改矩阵&#xff0…