【计算机网络】初识Tcp协议

在这里插入图片描述

💻文章目录

  • 📄前言
  • Tcp基础
    • 概念
    • Tcp 的报文格式
    • 三次握手
    • 四次挥手
  • Tcp的滑动窗口机制
    • 概念
    • 超时重传机制
      • 高速重传
  • TCP传输控制机制
    • 流量控制
    • 拥堵控制
      • 慢启动
  • Tcp的性能优化机制
    • 延迟应答
    • 捎带应答
  • 📓总结


📄前言

TCP三次握手、四次挥手,相信许多计算机网络初学者们都对这些问题感到困扰,TCP协议作为考试、面试的大常客,如果不真正了解它们的原理,那么等待你的很可能是挂科、回去等通知吧(大悲)。为了避免悲剧的再度发生,学习TCP协议不容刻缓,从现在开始!!!

Tcp基础

概念

TCP(Transfer Control Protocol) ,是一种可靠的、面向连接的网络通信协议,常用与那些对数据完整性有严格要求的场景,如聊天、文件传输、Web浏览等场景。

Tcp能够实现对数据的流量控制、重发控制、拥塞控制等功能,如果只是在应用层中使用TCP协议,那么肯定是无法体会得到其内部机制的精细,让我们从理论开始入手Tcp协议吧。

Tcp的优缺点:

  • 优点

    • 保障数据传输的可靠性
    • 拥有流量控制功能
    • 拥有拥塞控制功能
  • 缺点

    • 实现复杂,性能较低(相比UDP)
    • 延迟较高,Tcp偏重于数据的可靠传输

Tcp 的报文格式

要了解Tcp的工作机制,就得先从它的报文格式开始谈起,下图为Tcp的报文格式。

		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |          源端口号            |          目的端口号              |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                        序列号                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                        确认号                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |   4| 保留  |     |U|A|P|R|S|F|   |                     |
		 |   首部    | (6) |     |R|C|S|S|Y|I|   |      16位窗口大小     |
		 |   大小    |       |     |G|K|H|T|N|N|   |                     |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |           16位校验和         |           16位紧急指针            |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                       选项及填充(若有)                         |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 |                          数据                                 |
		 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 端口号:Tcp使用4字节(32bit)来表示源端口和目的端口号,系统会根据端口号的不同来区分连接。
  • 序列号:数据的序列号,因为接收的数据顺序可能不一致,所以需要序列号来进行排序。
  • 确认号:用于告知发送端已经下一次要收的数据序列。
  • 首部大小:用于确定Tcp的报头长度,计算方式为 首部大小 * 4,也就是说报文头部大小最大为60字节。
  • 标志位:类似于一种信号,使用bit位来标志使用到的标志位。
    • URG (Urgent):确定紧急指针是否有效,一般很少用紧急指针的内容。
    • ACK (Acknowledge):表明数据已经收到。
    • PSH (Push): 告诉系统赶紧把数据取走
    • RST (Rest): 用于重置连接,在服务器客户端连接认知不一致的情况使用。
    • FIN (Finish):用于4次挥手,表明要结束连接。
  • 窗口大小:流量控制机制,用于表明接受方的缓冲区大小。
  • 校验和:用于校验数据是否完整。
  • 紧急指针:用于标识一个字节的紧急数据的地址(很少用到)。
  • 选项:常见的选项有MSS(Maximum Segment Size)——拥塞窗口大小。

三次握手

三次握手是TCP协议进行网络通信时必须要做的一件事情,所有的连接都的要进行三次握手后才能开始传输数据。这是为了确定通信双方能够建立可靠的连接,并且交换双方的信息。

三次握手的过程

  1. 第一次握手由客户端开始发起,用于确定服务器是否存在。
  2. 第二次握手是服务器应答请求并发起连接请求,当客户端收到后则客户端对服务器的连接就已经建立完毕。
  3. 第三次握手是客户端通知服务器建立连接。

请添加图片描述

连接丢失的情况:

  • 第一、二次握手连接丢失:客户端因为没有收到服务器的消息,所以会重新发送报文给服务器。
  • 第三次握手连接丢失:这种情况便是双方连接认知不一致,因为客户端会认为服务器端已经收到了报文并且建立了连接。客户端在这种情况下发送数据给服务器端的话,服务器会发送一个带有RESET标志的报文给客户端,重新进行三次握手。

请添加图片描述

四次挥手

四次挥手是用于安全断开连接的措施。当客户端选择断开连接的时候,服务器端可能还有数据没有传输完毕,所以需要将连接稍微延长,直到数据被完全传输完毕。

  1. 第一次挥手:表明本地已经没有需要发送的数据,告诉远端准备好断开连接。
  2. 第二次挥手:远端已经收到FIN信号,返回应答,并继续处理未处理完的数据。
  3. 第三次挥手:远端已经处理完所有数据,告诉本地已经关闭连接(FIN)。
  4. 第四次挥手:本地进行应答,然后进入TIME_WAIT状态,一段时间后结束(CLOSED)。

请添加图片描述

四次挥手的小细节:

  • 四次挥手不像三次握手一样,会造成认知不一致状态。
  • 四次挥手有极小概率会变成三次挥手(即当FIN信号到了的时候,数据早已经处理完毕)。
  • TIME_WAIT状态的时间是2 * MSL(最大报文生存时间),而这个时间也是Tcp报文在网络的最大生存时间,从而确保网络的延迟报文能够正确接收,避免影响下次复用该端口号时收到未知的报文。

Tcp的滑动窗口机制

概念

Tcp的三次握手中报文的交换是一个接一个的,但如果数据的传输也是如此,势必会让传输的效率遭到大幅度地下降,于是Tcp协议使用了滑动窗口这种机制来让数据高效传输。

请添加图片描述

滑动窗口传输的细节:

  1. 滑动窗口通过序列号来将收到的报文规范排列。
  2. 滑动窗口使用确定序列号来通知远端下一个要接收到报文。
  3. 确定序列号代表该序列号之前的报文已经全部接收。
  4. 滑动窗口允许一定的确定报文丢失,因为确定序列号代表之前的报文已经全部接收,只要最后到确定报文到达即可。

超时重传机制

当Tcp发送报文长时间没有得到应答,则会进行超时重连,没有收到应答的原因可能是发送的报文数据在网络传输过程中丢失了,也可能是对端发送的ACK消失了。无论是哪一种情况,发送方都会重新发送数据给接受端,接受端再根据Tcp报文中的序列号来确定该数据是否已经接收过

请添加图片描述

高速重传

我们已经知道滑动窗口是用于提高数据传输的效率的,如果有任意一个报文没收到都要等待这么长时间才能重新接受,那么不就是本末倒置了吗?于是TCP又设置了高速重传机制——当连续三个ACK报文的确认序列号都相同时,发送端将重发该序列段的数据。

请添加图片描述

TCP传输控制机制

流量控制

设想一下,如果你正在下载某个文件,下载速度非常地快,以至于你的硬盘都来不及去读取你下载的内容,而服务器又不停地高速给你发送数据,那么你的系统也只能丢弃这些数据,但这样会造成非常大的网络资源浪费。有没有什么办法能够阻止这种浪费呢?

你是否还记得Tcp报头中有一个窗口大小呢?其实Tcp在进行三次握手和传输数据期间,都会根据双方缓冲区的大小动态更新窗口大小,从而实现流量的控制。

请添加图片描述

流量控制的小细节:

  1. 接收端通过接收缓冲区的大小更新滑动窗口大小,然后通过ACK报文通知发送端。

  2. 窗口大小也是反映网络吞吐量的标准。

  3. 当接收端窗口大小为0,发送端将停止发送数据一段时间并定时发送窗口探测,直到接收端有能力接受数据。

拥堵控制

慢启动

我们已经知道TCP拥有流量控制功能,滑动窗口能够根据对方的缓冲区(窗口大小)动态调整,但网络环境是复杂的,我们还需要考虑客户端与服务器之间的网络情况。如果一次发送大量的数据给对方,可能会对网络造成瘫痪。为了防止这种情况的发生,TCP使用了慢启动算法。

请添加图片描述

  1. 慢启动:其实在Tcp协议的内部,还定义了一个叫做拥塞窗口的变量(非窗口),当数据开始进行传输时,这个值被设为1,发送端每收到一个来至接收端的ACK时,拥塞窗口都会呈指数增长

  2. 拥堵避免:一旦拥堵窗口达到一定大小(阈值)时便会进入线性增长模式,即每接受一个ACK,拥塞窗口就+1。

  3. 动态调整: 因为网络的状态总是不稳定的,所以拥塞窗口的阈值会随着网络的丢包/持续传输而动态变化。

滑动窗口大小实际为:min( 窗口大小,拥塞窗口 )。

Tcp的性能优化机制

延迟应答

在文章上方的介绍中,我们都是以发送端每发送一个报文,接收端就返回一个报文来进行通信的,但实际的通信过程中,接收端并不会立刻应答,而是选择等待一段时间,接受多个报文后再回复对方,从而减少网络的压力。

请添加图片描述

延迟应答的小细节:

  1. 根据操作系统的不同,可能会在接受到两个报文后直接回复。
  2. 根据操作系统的不同,延迟发送的时间也会不同,时间越长触发超时重传的概率也就越高,一般操作系统将延迟应答时间设置为0.2秒。

捎带应答

捎带应答其实我们在三次握手中已经见到过了,其实也就是在发送其他数据的时候同时带着应答报文,从而减少应答报文在网络的传输,降低网络压力。

📓总结

TCP协议的设计不仅考虑了连接的可靠性,还考虑到了流量控制、拥堵控制、性能优化等各种方法,相信学习了本文了你,被问到TCP协议的特点时,肯定能侃侃而谈,给对方一个好影响吧。

参考书籍:《图解TCP/IP》

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【qt】QListWidget 组件

QListWidget 组件 一.QListWidget的用途二.界面设计三.QListWidget的添加1.界面添加2.代码添加 四.列表项的设置1.文本2.图标3.复选框4.列表大小 五.字体和图标的设置1.字体:2.图标: 六.设置显示模式1.图标2.列表 七.其他功能实现1.删除2.全选3.反选4.ad…

IO端口编址

统一编址 特点 独立编址 特点 内存地址分配 区别 应用 IO端口地址译码 硬件上的实现 示例1: 示例2: IO指令 软件上的实现 示例

Vue - JavaScript基础学习

一、语言概述 JavaScript 中的类型应该包括这些: 1.数字(默认双精度区别于Java) console.log(3 / 2); // 1.5,not 1 console.log(Math.floor(3 / 2)); // 10.1 0.2 0.30000000000000004NaN(Not a Number&#x…

为什么 buffer 越大传输效率越低

先看 从边际效益递减看 buffer 中挤占带宽 中的两个模型: E1 inflight_prop - inflight_buff: y 2 t x − b x a − x y2tx-\dfrac{bx}{a-x} y2tx−a−xbx​E2 bw / delay: y a x − x 2 b t a − t x y\dfrac{ax-x^2}{bta-tx} ybta−…

OpenMV学习笔记1——IDE安装与起步

目录 一、OpenMV IDE下载 二、OpenMV界面 三、Hello World! 四、将代码烧录到OpenMV实现脱机运行 五、插SD卡(为什么买的时候没送?) 一、OpenMV IDE下载 浏览器搜索OpenMV官网,进入后点击“立即下载”&#xff0…

深度学习基于Tensorflow卷积神经网络VGG16的CT影像识别分类

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着医疗技术的快速发展,CT(Computed Tomography)影像已成为医生…

面试准备【面试准备】

面试准备【面试准备】 前言面试准备自我介绍:项目介绍: 论坛项目功能总结数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别为什么要…

Linux-应用编程学习笔记(二、文件I/O、标准I/O)

一、文件I/O基础 文件 I/O 指的是对文件的输入/输出操作,就是对文件的读写操作。Linux 下一切皆文件。 1.1 文件描述符 在 open函数执行成功的情况下, 会返回一个非负整数, 该返回值就是一个文件描述符(file descriptor&#x…

Python3 笔记:sort() 和 sorted() 的区别

1、sort() 可以对列表中的元素进行排序,会改变原列表,之前的顺序不复存在。 list.sort(key, reverse None) key:默认值是None,可指定项目进行排序,此参数可省略。 reverse&#…

零基础PHP入门(一)选择IDE和配置环境

配置环境 官网下载安装包,windows https://windows.php.net/download#php-8.3 我是下载的最新版,也可以切换其他版本 https://windows.php.net/downloads/releases/archives/ 下载好压缩文件后,双击解压到一个目录 D:\soft\php 复制ph…

Vue 3 的 setup语法糖工作原理

前言 我们每天写vue3项目的时候都会使用setup语法糖,但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的?为什么在setup顶层定义的变量可以在template中可以直接使用?为什么import一个组件后就可以直接使用,无需…

匝间冲击耐压试验仪产品介绍及工作原理

产品简介 武汉凯迪正大KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题,以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等,都会造…

零基础代码随想录【Day42】|| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

目录 DAY42 1049.最后一块石头的重量II 解题思路&代码 494.目标和 解题思路&代码 474.一和零 解题思路&代码 DAY42 1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整…

Axure软件安装教程

链接:https://pan.baidu.com/s/1fHrSrZ7PIeDZZpn6QyJ6jQ?pwdb4mv 提取码:b4mv 安装完后点击Finish 名字随便起 关闭Axure 复制到安装目录下 最后成果

ASP+ACCESS基于WEB社区论坛设计与实现

摘要:系统主要实现BBS网站全部功能。采用目前应用最为广泛的ASP作为开发工具来开发此系统、以保证系统的稳定性。采用目前最为流行的网页制作工具Dreamweaver和目前最为流行的动画制作工具Flash MX。整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发&…

第七步 实现打印函数

文章目录 前言一、如何设计我们的打印函数?二、实践检验! 查看系列文章点这里: 操作系统真象还原 前言 现在接力棒意见交到内核手中啦,只不过我们的内核现在可谓是一穷二白啥都没有,为了让我们设计的内核能被看见被使用…

uniapp微信小程序在ios端返回不显示弹窗的bug解决

这个问题其实是因为返回页面的时候弹的太快了导致的解决办法: 其实就是返回页面的弹窗加个延迟就好啦

电脑同时配置两个版本mysql数据库常见问题

1.配置时,要把bin中的mysql.exe和mysqld.exe 改个名字,不然两个版本会重复,当然,在初始化数据库的时候,如果时57版本的,就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …

golang通过go-aci适配神通数据库

1. go-aci简介 go-aci是神通数据库基于ACI(兼容Oracle的OCI)开发的go语言开发接口,因此运行时需要依赖ACI驱动和ACI库的头文件。支持各种数据类型的读写、支持参数绑定、支持游标范围等操作。 2. Linux部署步骤 2.1. Go安装: 版本:1.9以上…

[数据集][目标检测]吸烟检测数据集VOC+YOLO格式1449张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1449 标注数量(xml文件个数):1449 标注数量(txt文件个数):1449 标注…