计算机网络:传输控制协议(Transmission Control Protocol-TCP协议

计算机网络:传输控制协议(Transmission Control Protocol-TCP协议)

  • 本文目的
  • 前置知识点
  • TCP协议简介
  • 主要特性
  • 通信流程
    • 1. 建立连接的过程(三次握手,243)
      • 1.1 为什么要三次握手,两次不行吗?
    • 2. 释放连接的过程(四次挥手,3343)
      • 2.1 TIME-WAIT时间等待状态是做什么的?
  • 参考文献

本文目的

介绍TCP协议的内容,三次握手和四次挥手的必要性和原因

前置知识点

  1. 计算机网络基本知识。

TCP协议简介

全称Transmission Control Protocol,传输控制协议,运输层协议。

主要特性

参考《计算机网络》传输层协议TCP概述p211

  1. 面向连接的运输层协议,传输前需要简历TCP连接
  2. 每一条TCP协议都是点对点通信的
  3. 提供可靠交付的数据,通过TCP连接传输的数据无差错,不丢失,不重复
  4. 全双工通信
  5. 面向字节流

通信流程

1. 建立连接的过程(三次握手,243)

需要阐明为什么每次交互会有这些标志位。

图解如下
在这里插入图片描述

  1. 最开始客户端和服务器都处于关闭状态
  2. 服务器创建传输控制块(TCB,Transmit Control Block),进入绑定自己的ip和端口进入监听(listen)状态
  3. 客户端创建TCB,已知服务器的ip和端口,向服务器发出连接请求报文,包括以下内容:(发送后进入同步已发送SYN_SENT状态
    • SYN(SYNchronization)同步序号置1,表示这是一个连接请求报文
    • seq初始序号x,该报文不携带数据但是需要消耗一个初始序号,也是服务器应答的依据(服务器需要应答x+1这样客户端才知道刚刚那条报文发过去了)
  4. 服务器收到连接请求报文之后,如同意连接,返回确认报文段,包含以下内容:(发送后进入同步收到SYN_RCVD状态
    • SYN同步序号置1,表示这是一个连接接受报文段。
    • seq初始序号y,同样的需要小号一个初始序号,也是客户端应答的依据。
    • 确认ACK = 1,ACK= 1的时候确认号字段(ack)才有效,建立连接后所有的报文段都要把ACK置1。
    • 确认号ack = x + 1,期望对方下一个报文段第一个字节的序号,表示x之前的数据都收到了。
  5. 客户端收到连接确认报文之后,还要再给B发出确认,包含以下内容:(同时客户端已进入连接建立ESTABLISHED状态
    • ACK = 1,seq = x + 1, ack = y + 1。
    • 可以包含数据,如果不包含则不消耗x + 1这个序列号。
  6. 服务器收到之后进入连接建立ESTABLISHED状态,三次握手建立成功。

1.1 为什么要三次握手,两次不行吗?

参考《计算机网络》5.9 TCP的运输连接管理p239

两次握手可以避免已失效的连接请求报文段,客户端发送给服务器但是延迟送达,对于客户端来说早已失效(过期了),而且失效之后客户端没有再重发请求,但是服务器响应并且发回确认报文段,如果两次握手,服务器此时就开始建立连接,而客户端根本不会相应确认报文段,所以没连接,服务器就会干等消耗资源

其他情况理论上都可以被三次握手解决。试图举反例举不出来。

2. 释放连接的过程(四次挥手,3343)

在这里插入图片描述

  1. 最开始客户端和服务器都处于ESTABLISHED状态
  2. 客户端发完要发的消息之后,需要释放连接,发出连接释放报文,包含以下内容:(同时进入终止等待1-FIN-WAIT-1状态
    • FIN = 1,表示是一个连接释放报文
    • seq = u,释放报文需要消耗一个序号。
    • ACK = 1,理由同连接的时候一致。
  3. 服务器收到连接释放报文之后需要立刻应答,表示收到了连接释放报文,包含以下内容:(同时进入关闭等待-CLOSE-WAIT状态
    • ACK = 1
    • ack = u + 1
    • seq = v,需要消耗一个序号
  4. 客户端收到之后进入终止等待2-FIN-WAIT-2状态,可能服务器还有一些消息要发,这个阶段如果服务器发消息,客户端也要接着收。这个时候TCP称之为半关闭状态。
  5. 服务器也发完消息之后,发送连接释放报文,包含以下数据:(同时进入最后确认-LAST-ACK状态
    • FIN = 1,表示释放连接报文
    • seq = w,因为因为可能半关闭期间发了些消息,所以不是v + 1。
    • ack = u + 1不变,因为客户端没发过消息了。
    • ACK = 1。
  6. 客户端收到之后,发送最后确认,包含以下内容:(然后进入时间等待-TIME-WAIT状态
    • ACK = 1
    • ack = w + 1
    • seq = u + 1
  7. 服务器收到之后就可以关闭连接了
  8. 客户端TIME-WAIT结束后也会断开连接。

2.1 TIME-WAIT时间等待状态是做什么的?

参考《计算机网络》5.9.2 TCP的连接释放p240

避免最后一个客户端发出的ACK报文丢失带来的问题。

时间等待计时器TIME-WAIT timer 是2MSL(Maximum Segment Lifetime)最长报文段寿命

  1. 当最后一个报文丢失(超过了MSL)的时候,服务器收不到会卡在最后确认-LAST-WAIT状态,这个时候服务器可能会重新发送连接释放报文,客户端需要保证能收到,才有可能再次发送最后确认的报文。一来一回刚好是两倍的MSL。
  2. 保证本次通信的所有报文都消失(2MSL之后肯定都消失了),防止旧的包干扰下一次连接
    • 个人理解不一定对:假设第一次发了两次连接请求,但是有一个卡在路上了,然后关闭了,然后卡在路上的那个又到服务器了,其实服务器是可以不用理的

参考文献

《计算机网络》传输层协议TCP概述p211
《计算机网络》5.9 TCP的运输连接管理p239
《计算机网络》5.9.2 TCP的连接释放p240

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

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

相关文章

【QT入门】 Qt代码创建布局之水平布局、竖直布局详解

往期回顾: 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号-CSDN博客 【QT入门】 Qt内存管理机制详解-CSDN博客 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解 先看两个问题: 1、ui设计器设计界面很方便&#xf…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog ! logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版, 下载页面&#…

ES的集群节点发现故障排除指南(2)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容,第二部分。 原文参考及相关内容: 英文原文(官网) 第一部分-(1) 已选出主节点但状态不稳定? 当一个节点赢得主节点选举时&…

ReentrantLock 原理

(一)、非公平锁实现原理 1、加锁解锁流程 先从构造器开始看,默认为非公平锁实现 public ReentrantLock() {sync new NonfairSync(); } NonfairSync 继承自 AQS 没有竞争时 加锁流程 构造器构造,默认构造非公平锁(无竞争,第一个线程尝试…

二叉树|701.二叉搜索树中的插入操作

力扣题目链接 class Solution { public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root NULL) {TreeNode* node new TreeNode(val);return node;}if (root->val > val) root->left insertIntoBST(root->left, val);if (root->val < val) r…

【JavaEE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

RobotFramework编写用例,在Jenkins上如何实现用例的并发运行?

我们了解RobotFramework编写自动化测试用例的方法&#xff0c;了解如何将用例在Jenkins上运行。 但是&#xff0c;随着用例的增多&#xff0c;传统的pybot/robot命令运行测试用例会耗费大量的时间&#xff0c;这就慢慢成为了一个苦恼的问题。 那么&#xff0c;在Jenkins上如何…

Linux_进程概念_冯诺依曼_进程概念_查看进程_获取进程pid_创建进程_进程状态_进程优先级_环境变量_获取环境变量三种方式_3

文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程…

探索Python人工智能在气象监测中的创新应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

修改nuxtjs项目中的浏览器图标步骤

处理步骤&#xff1a; 打开配置页面 使用el-upload 上传图片到后台 后台把图片转为ico&#xff0c;返回图标路径 配置页面修改本页面预览图&#xff0c;点击保存&#xff0c;修改的数据库。 通知nuxt布局页面&#xff0c;修改head节点中的图标属性&#xff0c;…

Vscode与Cmake搭配配置opencv使用

vscode与Cmake基本使用 下载插件 CtrlShiftp打开VSCode的指令面板&#xff0c;然后输入cmake:q&#xff0c;VSCode会根据输入自动提示&#xff0c;然后选择CMake: Quick Start选择编译器根据提示输入项目名称选择可执行文件编译项目 方式一&#xff1a;执行命令cd build cmake…

[密码学] 密码学基础

目录 一 为什么要加密? 二 常见的密码算法 三 密钥 四 密码学常识 五 密码信息威胁 六 凯撒密码 一 为什么要加密? 在互联网的通信中&#xff0c;数据是通过很多计算机或者通信设备相互转发&#xff0c;才能够到达目的地,所以在这个转发的过程中&#xff0c;如果通信包…

数据库-索引快速学

索引 当表中数据量庞大时&#xff0c;往往搜索一条数据就会耗费很长的时间等待 索引是帮助数据库高效获取数据的数据结构 create index 索引名 on 数据表名&#xff08;字段名&#xff09;;为该表下的某一字段创建索引&#xff0c;检索耗时会大大的减小 索引的优缺点 优点&…

盏燕生物科技将出席2024第七届燕窝天然滋补品博览会

参展企业介绍 深圳市盏燕生物科技有限公司&#xff0c;办公室地址位于中国第一个经济特区&#xff0c;鹏城深圳&#xff0c;深圳市龙岗区平湖街道禾花社区富安大道18号亚钢工贸大楼1栋1017A&#xff0c;我公司主要提供一般经营项目是&#xff1a;初级农产品、海产品、化妆品、…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python抓取抖音直播间数据的简易指南 说明&#xff1a;本文已脱敏&#xff0c;隐去地址…

上海:6月1日起取消企业复工复产白名单制

财经新闻5月29日消息&#xff1a;上海市人民政府关于印发《上海市加快经济恢复振兴行动计划》的通知。 《方案》包括千方百计缓解各类市场主体困难&#xff0c;全面有序推进复工复产和市场复工复产&#xff0c;多措并举稳外资稳外贸&#xff0c;大力促进消费加速复苏&#xff0…

【Ubuntu】Ubuntu LTS 稳定版更新策略

1、确保下载环境 sudo apt update && sudo apt upgrade -y sudo apt autoremove 2、安装更新管理器 sudo apt install update-manager-core -y 3、设置只更新稳定版 sudo vim /etc/update-manager/release-upgrades 4、开始更新&#xff0c;耐心等待 sudo do-re…

Spring05 SpringIOC DI

名词解释 今天我们来介绍Spring框架的最重要的part之一 SpringIOC 和 DI 这里的SpringIOC 其实是容器的意思,Spring是一个包含了很多工具方法的IOC容器 什么是IOC呢? IOC其实是Spring的核心思想 Inversion of Control (控制反转) 可能这里你还是不理解这个是啥意思 其实就…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

ZYNQ学习之Ubuntu环境下的Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…