4.网络之TCP

news2024/11/27 12:43:55

TCP协议(传输层)

文章目录

  • TCP协议(传输层)
  • 1. TCP报文格式
  • 2. TCP相关机制
    • 2.1 确认应答机制
    • 2.2 超时重传机制
    • 2.3 连接管理机制(重点)
      • 2.3.1 三次握手
      • 2.3.2 四次挥手
    • 2.4 滑动窗口机制
    • 2.5 流量控制机制
    • 2.6 拥塞控制机制
    • 2.7 延迟应答机制
    • 2.8 捎带应答机制
  • 3. TCP异常处理
    • 3.1 粘包问题
    • 3.2 异常中断
      • 3.2.1 进程崩溃
      • 3.2.2 主机关机
      • 3.3.3 主机掉电
      • 3.3.4 网线断开
  • 4. TCP和UDP的对比

1. TCP报文格式

    TCP,即Transmission Control Protocol,传输控制协议。
在这里插入图片描述

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
  • 32位序号:发送数据的第一个字节的序列号
  • 32位确认号:期望接收的序列号
  • 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
  • 6位标志位:
    • URG:紧急指针是否有效
    • ACK:确认号是否有效
    • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
    • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
  • 16位窗口大小:取流量控制和拥塞控制的较小值
  • 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
  • 16位紧急指针:标识哪部分数据是紧急数据;
  • 40字节头部选项:包括选项列表结束、误操作、最大段长度、窗口扩展因子、时间戳

2. TCP相关机制

    TCP对数据传输提供的管控机制,主要体现在两个方面:可靠传输和效率,可靠传输是TCP 的初心。这些机制和多线程的设计原则类似:保证数据传输可靠的前提下,尽可能的提高传输效率。下面会介绍一些TCP协议的机制,帮助你理解TCP协议(传输层)。

2.1 确认应答机制

在这里插入图片描述
在这里插入图片描述

    确认应答机制是保证TCP可靠传输核心机制,TCP将每个字节的数据进行编号,每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发送。
    确认序号就是TCP报文中的32位确认序号,这个序号以可以确保应答报文和数据对应,在出现“后发先至”这样的情况时,程序可以按照正确的顺序组织数据。
    可靠传输,并不是指数据能够百分百到达对端,因为现实网络环境是非常复杂的,受到各种因素的综合制约。这里的可靠传输主要有两方面含义:

  1. 发送发发出数据后,能够知道对方是否收到数据。
  2. 如果对方没有收到,则可以采取“补救措施”,如重传等。

    如何区分一个TCP数据报是普通报文还是应答报文呢?TCP报文中ACK这一位为1,表示当前数据时一个应答报文,此时该数据报中的32位确认序号字段就会生效,反之同理。
在这里插入图片描述
    TCP可靠传输是通过以确认应答为核心,加以其他机制(超时重传,连接管理等)共同完成的。

2.2 超时重传机制

在这里插入图片描述

    确认应答是在,应答报文一定能被收到的理想情况下,但是应答报文也可能会丢包。那么为什么会产生“丢包”呢?
    我们发送的数据在发送途中经过路由器、交换机的转发,但是交换机的处理能力是有限的,如果同一时间的流量过大,路由器、交换机不会积压这些数据,而会之久丢弃一部分,只在自己的承受范围内处理数据,而被丢弃的数据也就永远的消失在了网络上了。
    如果应答报文(ACK)丢包了,那么发送方也就无法得知是否发送成功,此时可靠传输也就无从谈起了。引入“超时重传”机制,就可以在应答报文或者普通报文发出后,一段时间内无响应后,选择进行重新传输。
    超时重传的丢包有数据报丢包、应答报文丢包两种情况,而发送方根本无法区分这两种情况,会“一视同仁”的进行重传操作。由于重传后到达对端的概率会大大增加,如果重传多次,还未收到对端ACK,说明网络上已经出现了严重故障。TCP对重传成功到达对端这件事是抱有“悲观预测”的,超时的等待时间也会逐渐变长,当传输一定次数后还没有收到对端的ACK,此时就会触发TCP的重置连接操作。

2.3 连接管理机制(重点)

    我们之前说过TCP协议是有连接的,这个连接的建立过程,就是三次挥手(打招呼),断开连接就是四次挥手。
    这里“挥手” handshake,类似于打招呼,发起连接的一方向对方,发送不包含业务数据的数据报,用来唤起对方的注意,从而触发后续的操作。

2.3.1 三次握手

在这里插入图片描述
    1. 客户端主动发起建立连接的请求,向服务器发送一个不携带业务数据的数据报(syn 同步报文段)
    2. 服务器接收到客户端的建立连接请求后,会返回一个应答报文(ack),并且也会向客户端发送一个syn,并且这两个报文是合并为一个报文发送的(报文中SYN 和 ACK 都为1)【此时服务器验证了自己的接收能力】
    3. 客户端收到服务器发来的应答报文和同步报文段也会向服务器返回一个ack【客户端验证了自己的接收能力和发送能力】
    4. 服务器收到客户端发来的ack,连接建立完成。
    TCP的初心还是可报传输,如果此时网络已经存在重大故障,可靠传输也就无从谈起了。

三次握手核心作用

  1. 投石问路,确认当前无网络是否畅通
  2. 验证发送发和接收方的收发能力
  3. 让通信的双方在握手过程中,针对一些重要的参数进行协商。比如报文序号等系列参数。

2.3.2 四次挥手

在这里插入图片描述

    四次握手中的ACK和FIN一般不能合并,ACK和FIN的触发时机不同,ACK在内核收到数据后会立即进行响应,而FIN要在应用程序中调用close()方法后才能触发。这两个操作一般是不会合并的,但是在延时应答机制和捎带应答机制下,也可能合并。
    这里只介绍了,四次挥手完成,正常的连接断开,不分异常断开的情况会在下文的异常处理中介绍到。
    由于丢包状况的存在,前三次挥手若丢包都能正确触发重传,但是如果最后一次挥手丢包了,而客户端又早早地进入CLOSED状态(连接断开),那么服务器就会等待ACK报文,又因为客户端以及断开连接不会触发超时重传,所以服务器永远也等待不到客户端的ACK了。
    在这种情况下,客户端子啊第三次挥手之后不会立即进入CLOSED状态,而是进入TIME_WAIT状态,等待一段时间,若ACK丢了,就会触发服务器的超时重传,重发FIN,进而客户端再次进行ACK响应。
    这里的TIME_WAIT的等待时间一般会设为2*MSL,MSL是网络上两个节点的最大消耗时间,确保挥手留有客户端ACK到达服务器和ACK丢包服务器超时重传的时间。

2.4 滑动窗口机制

    前面介绍的确认应答、超时重传、连接管理机制都是为了保证可靠传输,而可靠传输必定要牺牲一定的效率,而滑动窗口机制则是一种”亡羊补牢“的措施。让TCP的效率尽可能的高一点。
    在原来的机制下,没发送一个TCP数据报都要等待对端返回ACK后才能继续发送,而滑动窗口机制则是先发送一批数据,对这一批数据进行集中等待ACK,收到某个ACK窗口就可以往下滑动。在不等待的情况下,批量发送多少数据的上限成为”窗口大小“。
在这里插入图片描述
    在这个过程中如果产生丢包,有两种情况。

    一是ACK丢了,这种情况是不需要进行重传的,因为ACK在滑动窗口机制下被赋予了新的含义,是从xxx个字节之前的数据都收到了,如果在这之前的ACK丢失并不会影响到现在的判断。在这里插入图片描述
    二是数据丢了,数据丢失后,接受方会将这个之后的数据丢弃,不断向发送方索要该序号的数据,等待该数据报的到来。

在这里插入图片描述
    何时回触发TCP的滑动窗口机制呢?如果收发双方传输的数据量比较小,也不平频繁,此时不会触发滑动窗口机制,任然是按照确认应答和超时重传机制传输。但是,如果收发双方传输的数据量较大,比较频繁,就会触发滑动窗口机制,进行批量发送,快速重传。

2.5 流量控制机制

    通过滑动窗口机制传输数据,效率得到了一定的提升,但是这个窗口也不是越大越好,为了控制窗口大小,引入了流量控制机制和拥塞控制机制。分别从接收方的处理能力和网络路线的状况来优化窗口大小,动态调整。

    由于接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控(Flow Control) - 生产者消费者模型
    流量控制机制是站在接收方的角度,反向制约发送方的发送速度,发送方的发送速度,不应该超过接收方的处理能力。发送方会根据接受方缓冲区的剩余空间大小,来作为衡量窗口大小的指标,这就意味着:

  • 剩余空间越大,消费速度越快,处理能力越强,窗口大小越大,发送速度更快
  • 剩余空间越小,消费速度越慢,处理能力越弱,窗口大小越小,发送速度更慢

在这里插入图片描述
    TCP报文中的16位窗口大小,就是用于接收方将自己当前的缓冲区大小反馈给发送方。这个窗口大小只有16位,这是否以为这最大只能是64kb呢?TCP报文中的选项中,有一部分叫做窗口扩展因子,如果当前传输情况理想,窗口是可以更大的。
在这里插入图片描述
    在这个过程中如果接收方的接收缓冲区满了,那么发送方就会停止发送,等待接收方对接收缓冲区内的数据进行处理,那么停止多久呢?此时发送方会周期性的发送一个不携带业务数据的”窗口探测包“,这个数据报知识为了得到接收方的ACK,从而判断接收方的接收缓冲区的大小,从而做出进一步判断。

2.6 拥塞控制机制

    流量控制机制是站在接收方的数据处理能力视角上对窗口大小进行优化,这里的拥塞控制则是站在网络传输路径是否畅通(通信中间节点的情况)对窗口大小进行优化,最终的窗口大小要取两者的较小值。
    由于木桶效应,发送速度收到整个通信状况中的最短板决定,所以这里的拥塞控制会在不大于接收方的处理能力的情况下,逐渐增大 ,增大到某个临界点,出现丢包时再将窗口大小进行调整,此处也是动态变化的。

    如果在刚开始阶段就发送大量的数据,可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。TCP拥塞控制是一种慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;我们先看一个经典的拥塞控制。
在这里插入图片描述
    刚开始从一个比较小的速度开始发送,指数级递增,当达到某个阈值时停止指数增长,改为线性增长(假发增大),如果出现拥塞,那么直接从速度归零重新进行“慢开始”。
    这种经典的拥塞控制一旦遭遇拥塞,那么就会重新慢开始,下降速度太快,有一种开进版的拥塞控制,遭遇拥塞后,在原有阈值的基础上,计算出新的阈值,从这个新的阈值开始线性增长。

2.7 延迟应答机制

    如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。
在保证网络不会拥塞的情况下,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。
    当收到发送方的数据时,不必立即反馈ACK,等待接收方进行数据处理,让缓冲区空间剩余大小进行增长,此时窗口就会尽可能的大。

2.8 捎带应答机制

    捎带应答实在延时应答的基础上,进一步做出的效率上的优化,延时应答后,将应答报文和数据报文进行合并,一次性发送给发送方。减少了中间的封装和分用的开销。在这种情况下,TCP断开连接的四次挥手也是可能三次挥完的。

3. TCP异常处理

3.1 粘包问题

    由于TCP是面向字节流的,在接收方接收到数据从缓冲区读取数据时,就无法区分应用层数据报之间的边界。如果同时到来多个,那么就可能出现粘包问题。
在这里插入图片描述
在这里插入图片描述
    相比较之下,UDP则是面向数据报的,UDP的接收缓冲区中是一个个的DatagramPacket对象,应用程序读取时可以明确的知道边界,就不会出现粘包问题。
在这里插入图片描述
    要解决TCP的粘包问题,我们只需要明确TCP->应用层数据包间的边界。

  1. 使用分割符 如 \n这种行文本
  2. 使用长度进行标识,在数据包之前加上长度,让应用程序明确一个包多大。

    此处的应用层协议可以自定义,如xml、json、protobuffer等(边界明确的),当然也可以自定义应用层协议。

3.2 异常中断

3.2.1 进程崩溃

    进程没了,异常终止了。进场的文件描述符表也就释放了。相当于调用socket.close(),此时就会触发FIN,对方收到之后,会返回FIN和ACK,这边再进行ack (正常的四次挥手断开连接的流程)tcp的连接,可以独立于进程存在。(进程没了,tcp连接还在)

3.2.2 主机关机

    在进行关机操作时,会先触发强制关闭进程,相当于进程崩溃。此时就会触发FIN,对方收到就就会返回 ACK和FIN,但不仅仅是进程结束了,操作系统也关闭了。

  • 如果操作系统关闭之前对端返回的ACK和FIN到了,此时系统还是可以返回ACK进行正常的四次挥手,正常断开连接。
  • 如果操作系统关闭之前对端返回的ACK和FIN还未到,ACK和FIN迟到后,操作系统已经关机,无法对ACK和FIN进行回应,站在发送方的角度,以为是丢包了,然后进行重传,多次重传后都没有响应,也就放弃连接了。

3.3.3 主机掉电

    主机掉电是一瞬间的事情,对端是来不及反应的。

  • 接收方掉电:发送方就会一直等待ACK,然后触发超时重传,进一步触发TCP的连接重置,发出复位报文段,如果复位报文段发出后没有得到响应,连接也就会断开
  • 发送方掉电:此时接收方是无法区分是发送方没有进行数据发送还是挂了,TCP中提供了”心跳包“机制,接收方会周期性的给发送方发送一个心跳包(不携带业务数据)期待得到对端的应答,如果没有得到应答,在重复多次后,连接也会断开。

3.3.4 网线断开

    假设A给B发送数据,一旦网线断开,A就会触发超时重传 => 重置连接 => 断开连接。B就会 触发心跳包 => 对端未响应 => 断开连接【TCP的心跳包周期较长】

4. TCP和UDP的对比

    TCP 的优势在于可靠传输,TCP可以适用于绝大部分场景。
    UDP的优势在于效率跟高,适用于对”可靠性不敏感,效率敏感“的场景,同一个机房内部的数据传输就会优先考虑UDP,因为同一个机房内丢包的概率不大,希望数据能够更快的传输。在需要广播的场景下UDP也有得天独厚的优势,UDP天然支持广播,所谓广播就是将数据发给当前局域网的所有设备。

    如果本篇文章对你有帮助,请点赞、评论、转发,你的支持是我创作的动力。

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

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

相关文章

c++ | 字符串与指针的恩断情仇

我想&#xff0c;c/c中难的不是指针&#xff0c;而是其中的变化&#xff0c;尤其是思维的转变。很多东西 就是容易掉进陷阱。好在&#xff0c;你我都是善于思考的码农&#xff01; 大致情况是这样的&#xff0c;底层<–>c语言<–>c<–>应用 而数据的传输的最…

攻击域控丝滑小连招~

点击星标&#xff0c;即时接收最新推文 如果已经获得本地管理员账号或是域管理员账号&#xff0c;那么下一个目标通常是域控制器&#xff0c;对于渗透测试人员来说&#xff0c;光荣与荣耀的那一刻就是成功从域控制器提取所有的哈希值。但即使是拥有管理员权限&#xff0c;也无法…

windows10编译高版本openssl

参考文章 参考文章中的windows编译为低版本&#xff0c;在高版本的openssl编译中已经没有&#xff1a;“ms\do_ms.bat”这个脚本了&#xff0c;现记录下编译过程 1、准备工作 安装ActivePerl&#xff0c;安装后会自动写入环境变量&#xff0c;参照参考文章测试安装成功与否&a…

封装element-table合计行Hooks方法

背景: 在我们常做的后台管理系统中&#xff0c;经常的会遇到关于表格合计行的计算以及显示&#xff0c;如下图&#xff0c;我们采用的是element框架这一套 封装&#xff1a; 由于考虑到该需求是最常见的&#xff0c;每个中心可能都会涉及到&#xff0c;我们封装公共方法&#…

解决方案中word中分节符的使用

解决方案中必不可少的两个“符号”&#xff0c;分页符&#xff0c;分节符 有了分节符&#xff0c;可以为不同节设置不同的页眉页脚、分栏格式、纸张大小及方向、页边距、不同节间采用不同的页码序号&#xff0c;常用的功能主要是把word下一次的由原来的“竖版”&#xff0c;变…

pygame游戏编程库:初始化和显示(01/8)

一、说明 pygame是一个Python库&#xff0c;用于编写2D游戏和多媒体应用程序。它提供了一整套工具&#xff0c;可以帮助开发者创建图像、声音、动画等内容&#xff0c;并与用户进行交互。pygame还可以用于创建交互式教育软件、演示文稿、音乐应用程序等。它基于SDL库&#xff0…

线程锁、进程锁、分布式锁_Linux网络编程

线程锁 1、互斥锁&#xff1a;互斥锁首先是一个睡眠锁&#xff0c;如下图当线程C没有获取到资源时&#xff0c;线程锁会结束线程B切换到线程C。 2、自旋锁&#xff1a;而自旋锁在未获取到资源时线程C循环等待&#xff0c;尝试获取锁&#xff0c;一直占用核心。 3、读写锁:若一…

css基础之实现轮播图

原理介绍 图片轮播的原理是通过控制显示和隐藏不同的图片来实现图像的切换&#xff0c;从而创建连续播放的效果。用到的知识点有定位和定时器。 实现步骤&#xff1a; HTML 结构&#xff1a; 首先&#xff0c;需要在HTML中创建一个包含轮播图片的容器&#xff0c;通常使用 &l…

采用springboot、avue框架开发的:大型医院绩效考核系统成品源码

医院绩效考核系统全套源码&#xff08;演示自主版权医院应用案例&#xff09; 医院绩效考核系统&#xff0c;建立以医院发展目标为导向&#xff0c;以医务人员劳动价值、工作量为评价基础&#xff0c;统筹效率、质量、成本的绩效管理和绩效工资分配体系。系统支持RBRVS&#xf…

0003Java安卓程序设计-springboot基于Android的学习生活交流APP

文章目录 **摘** **要**目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把学习生活交流管理与现在网络相结合&#xff0c;利用java技术建设学习生活交流APP&…

python机器学习——实现Kmeans算法

K-means算法 关于K-means算法&#xff0c;它是一种无监督学习算法&#xff0c;用于将数据集分成预定数量的簇&#xff08;clusters&#xff09;。 K-means算法比较适合用来做聚类分析&#xff0c;而不是用来预测&#xff0c;换句话来说&#xff0c;K-means算法不擅长预测 K-…

基于SSM的搬家预约系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

数据结构之堆的实现(图解➕源代码)

一、堆的定义 首先明确堆是一种特殊的完全二叉树&#xff0c;分为大根堆和小根堆&#xff0c;接下来我们就分别介绍一下这两种不同的堆。 1.1 大根堆&#xff08;简称&#xff1a;大堆&#xff09; 在大堆里面&#xff1a;父节点的值 ≥ 孩子节点的值 我们的兄弟节点没有限制&…

“利用Lazada API揭秘电商数据:一键获取海量商品评论列表!“

要使用Lazada API获取Lazada商品评论列表&#xff0c;您需要先注册Lazada开发者账号并获取授权码和密钥。然后&#xff0c;通过调用Lazada API的item_comments接口&#xff0c;传入商品ID和国家域名后缀&#xff0c;即可获取到商品的评论列表。 以下是使用Lazada API获取Lazad…

4+1视图的理解和使用

软件架构 原文&#xff1a; Architectural Blueprints—The “41” View Model of Software Architecture 老外的原文还是很值得一看的&#xff0c;互联网上的很多文章理解得都比较粗浅 什么是软件架构&#xff1f;面试的时候很多面试官可能会问你最近在做的项目的架构。其实这…

uniapp原生插件之安卓TCP原生插件

插件介绍 安卓TCP插件支持自定义心跳数据&#xff0c;自定义心跳时间&#xff0c;断开连接时返回自定义数据等 插件地址 安卓TCP原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓TCP原生插件使用文档 用法 在需要使用插件…

Nginx反向代理(入门)

前言 反向代理 --> 服务器 Nginx反向代理是一种服务器架构模式&#xff0c;通过将客户端的请求转发给后端服务器来分担服务器的负载压力&#xff0c;同时提高了系统的可用性和灵活性。它是一种常用的应用程序负载均衡技术&#xff0c;通常被用来处理大量同时连接的Web请求…

【GEE】2、探索数据集

1简介 在本单元中&#xff0c;我们将讨论以下概念&#xff1a; Google 地球引擎中可用的潜在数据来源。 通过生态示例显示的数据集采样用例。 如何使用 Google 地球引擎访问重要的元数据。 2背景 要将遥感集成到您的研究和分析中&#xff0c;学习如何解析 Google 地球引擎上…

【Linux编译器】:gcc/g++的使用

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux编译器gcc/g的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

“01”滴答“摩尔斯电码”加密解密单个字符

“01”替换滴嗒“.-”“摩尔斯电码”字符&#xff0c;加密解密键盘输入的单个字符。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&a…