秋招TCP篇(较全的TCP网络知识,通俗理解底层逻辑)

news2024/11/17 6:02:22

TCP详细知识

    • 计算机网络
      • 八股-局域网和广域网详解
      • 八股-OSI七层模型和TCP/IP五层模型
      • 八股-数据在网络之间传递的过程
      • 八股-UDP详解
      • 根据协议格式详解TCP
      • Socket详解
      • 八股-TCP可靠性机制
        • 确认应答
        • 超时重传
        • 超时重传等待时间
        • 数据去重
      • 八股-三次握手和四次挥手
        • 三次握手
        • 四次挥手
        • 为什么要三次挥手和四次握手
      • 八股-滑动窗口详解
      • 八股-流量控制
      • 八股-拥塞控制
      • 八股-异常情况处理

计算机网络

八股-局域网和广域网详解

局域网LAN是范围内网络通信,组件方式有:计算机之间通过网线直连,通过集线器相互连接,通过交换机相互连接,通过交换机和路由进行相互连接

广域网WAN,通过许多局域网组合起来,连接世界各地,通过路由将各个局域网连接起来进行网络通信

要在局域网和广域网之间进行数据的传递,需要知道自己的本地地址,目标地址,本地端口,目标端口,数据传输之间的协议

常用的网络通信协议是TCP/IP 五元组进行数据之间的传递:

  1. 源IP:源主机IP
  2. 源端口号:源主机发送数据对应进程占用的端口号
  3. 目标IP:目标主机IP
  4. 目标端口号:目标接收数据对应进程占用的端口号
  5. 协议号

八股-OSI七层模型和TCP/IP五层模型

七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层

五层协议:应用层,传输层,网络层,数据链路层,物理层

八股-数据在网络之间传递的过程

首先应用层的数据通过端口发送,通过操作系统网络协议栈进行数据段的封装,传输层封装成TCP,UDP数据报,然后继续通过操作系统网络协议栈进行网络层的封装,添加IP地址头部信息,然后操作系统通过驱动程序将网络层的数据传递给网卡接口进行处理,网卡中通过NIC封装成数据数据帧,处理MAC地址等链路信息,然后通过将数据进行光/电信号的转换进行计算机间信息的传递

八股-UDP详解

UDP的特点:

无连接:不需要进行连接

不可靠传输:因为没有建立连接,无安全措施,发送失败后不会反馈信息

面向数据报:不会对数据进行分解,按照数据原样大小进行传输

缓冲区:UDP只有接收缓冲区,没有发送缓冲区,UDP直接将数据交由内核进行网络层的封装,他的接收缓冲区也无法保证UDP传输的顺序性

全双工:UDP的socket即能读也能写

在这里插入图片描述

16位UDP长度表明首部加上数据载荷一共的容量UDP的最大数据量为64KB,检验为采用的是CRC检验算法

CRC检验算法,循环冗余检验算法,将UDP数据中的每个字节进行累加,将累加结果保存在16位检验和中进行传递,接受方接收到数据之后将其中的字节重新加一边,与检验和中的数据进行比较,相等表示数据完整

根据协议格式详解TCP

在这里插入图片描述

4位首部长度:表示TCP头部有几个四位的字节

序号:发送方标明一串的字节的第一个字节

确认序号:确认机制回递给发送方的确认机制,表明下一个字节从哪个地方开始

保留位:用于后序拓展头部

标志位:URG(紧急指针是否有效),ACK(确认号是否有效),PSH(接收端立刻从缓冲区将数据读走),RST(要求重新建立连接),SYN(请求建立连接),FIN(通知对方自己要关闭连接了)

窗口大小:标定滑动窗口的大小

检验和:CRC校验进行头部和数据的校验

Socket详解

说到TCP和UDP就一定要说到Socket,他是一个套接字,我的理解就是他是TCP协议和UDP协议的具体实现接口,存在于传输层,将应用程序的数据使用Socket进行封装传递给操作系统进行传递,也可以通过Socket与服务端地址和端口建立连接进行数据传递,Socket可以理解为我们java中的缓冲流进行数据的传递

八股-TCP可靠性机制

TCP的可靠性传输主要是靠确认应答和超时重传来实现TCP的可靠性传输,

确认应答

当TCP发送方发送一个TCP报文后,接收方通过报文中的序号和字节长度计算出下一个TCP报文开始的字节长度,发送确认应答报文,告诉发送方当前成功接受,并说明下一个TCP报文的开始字节序号

超时重传

发送方一般在发送完成数据中会进行等待,等待接收方返回的确认ACK报文,但是有的时候会遇到发送方没有收到确认报文,这个时候为了维护数据的稳定就要进行重传,这个时候就要分两种情况

第一种情况: 发送方发送的数据接收方没有收到

这种情况当超过等待时间,就会进行重传

第二种情况: 发送发没有接收到ACK报文的数据

这种情况就要进行超时重传,但是重传之后在接收方需要进行数据去重

超时重传等待时间

在进行超时重传的过程中,时间间隔多久才会进行数据重传呢?现在有两种重传时间计算策略

第一种: 固定超时重传时间策略

超时时间以500ms为计量单位,第一次发送数据之后,进行超时等待,如果500ms没有反馈,就会进行数据重传,这个时候的等待时间就会变成500ms的2倍,超过时间再次进行数据重传,下一次等待时间为4倍的500ms,是2的指数倍时间进行递增,当达到一定的时间限制之后如果还是没有收到反馈,就会触发重置TCP数据报,标识位RST设置为1,发送TCP复位报文,重新连接,如果还是失败就会强制关闭连接

第二种: 动态计算超时重传时间策略RTO

通过RTT(从发送数据到收到ACK数据之后的反馈时间)通过TCP协议的时间算法动态的计算出超时等待时间RTO,如果第一次发送数据失败,RTO进行默认的超时时间初始化,一般是1~3秒

两种策略如何使用: 一般TCP在没有稳定连接的时候,使用第一种固定策略,一般TCP进行连接的时候使用,在稳定之后会切换到动态计算时间策略,提高效率,但是在释放连接的时候最后释放连接的超时等待时间是2MSL(MSL:系统自定的最大超时等待时间一般是2分钟)

数据去重

超时重传可能会造成数据重复,为什么需要进行数据去重:有的时候一些重复的数据可能会影响系统的数据,比如说购物接口,如果发送两次没有进行去重之后,就会访问两次,就会导致购物两次的状况发生

如何去重:首先找到重复的数据,通过序号找到重复的数据,在TCP内核中,给每个Socket对象都安排一个内存空间,成为接受缓冲区,相当于一个队列,通过序号找到重复的数据

八股-三次握手和四次挥手

三次握手和四次挥手是TCP协议建立连接和释放连接的过程,主要依靠可靠性机制进行

三次握手

第一次有客户端先向服务段发送建立连接请求SYN数据报,服务器端在接受到之后,向客户端发送确认报文和建立连接请求报文ACK+SYN报文,客户端收到之后,向客户端发送确认报文成功建立连接,在建立连接时候可能会发生第一次SYN报文丢失,超过超时时间之后重传即可,也有可能丢失ACK_SYN报文,重传之后服务端要进行数据去重

四次挥手

三次握手的发起人一定是客户端,四次挥手的发起人一般是客户端,第一次发送断开连接的FIN报文,服务端接收到之后会发送确认的ACK报文,服务端就会结束进行关闭连接的操作,操作完成之后向客户端发送关闭连接的FIN报文,客户端向服务端发送确认ACK报文三次挥手结束,释放连接

第一次发送ACK和收到FIN数据丢失后根据超时时间进行重传即可,第二次FIN丢失有服务器端进行超时重传,这个时候客户端并不会释放连接,会等待2MSL时间,确认时间内没有收到服务端的再次FIN报文,释放连接

为什么要三次挥手和四次握手

通过三次握手才能确定双方的接受数据和发送数据的能力是否正常,初始化序列号,为后边数据的传递做准备,防止旧的连接造成错误

四次挥手才能保证双方释放连接的操作正确,进行安全释放

八股-滑动窗口详解

TCP的可靠性保持最重要的就是确认应答,没法送一个报文就会返回一个ACK,这样会导致消耗大量的时间,为了解决这个问题,TCP创建了滑动窗口机制,根据滑动窗口的大小可以连续传递非常多的TCP报文到服务器段,滑动窗口中的数据并不是直接用于服务器端,而是先进入到服务器端的接收缓冲区中,应用程序在缓冲区中进行读取TCP报文,当读取之后检验后向客户端发送ACK报文,客户端不需要等待每一个ACK报文,如果发送了1000个TCP报文,收到第1000个ACK那这1000条数据自然发送成功,随着收到的ACK报文,发送端的滑动窗口不断的进行右移,滑动窗口的大小是会随机变化的,根据接受缓冲区的剩余大小,随着ACK报文活动窗口大小返回给客户端,客户端根据使用情况动态的调整大小,在进行滑动窗口初始化时,根据三次握手建立连接的SYN报文初始化滑动窗口的大小

数据丢失:

当然在滑动窗口进行数据传递的过程中自然也会出现数据丢失的情况,分两种情况:

ACK报文丢失:

这种情况不需要担心,假如说发送端没有接受到第十个ACK报文,但是接受到了第20个ACK接受报文,自然而然就知道是ACK丢失,不需要进行处理

数据丢失:

应用程序在从接受缓冲区中进行数据的读取的时候,当处理到一个丢失的数据的时候就会发送ACK报文,如果没有接收到重发的数据就会重传ACK报文,当发送端发现重复的ACK报文就知道是数据丢失就会进行重传机制

番外补充:

接受缓冲区和发送缓冲区,是操作系统内核根据Socket的创建建立的缓冲区,是一个队列,应用程序可以抽象为通过Socket的方法从中获取到数据


八股-流量控制

当滑动窗口过大的时候,往往会造成很多的数据丢失,得不偿失,于是通过动态的调节滑动窗口的大小来达到流量控制的效果,前面已经提到,通过接受缓冲区的剩余空间结合使用情况来调整滑动窗口的大小,当接受缓冲区没有剩余空间的时候传回来的窗口大小为0,这个时候发送端暂停发送,进行超时等待,等待返回ACK数据,当超时后还没有获得ACK报文,发送端会发送一个不携带数据的探测数据报,询问接收端的回应,这个流量控制是在接受端大小上判断并进行控制,并不能完全达到效果,数据在传输的过程中还占大部分原因

八股-拥塞控制

上边提到了仅仅靠流量控制是不行的,它不可以调整数据传输路途中网络带宽的问题,每次判断滑动窗口的大小是公式是,滑动窗口=min(拥塞窗口,流量控制窗口大小) ,在建立连接初期初始化拥塞窗口为几个报文的长度,拥塞阈值是窗口的最大值,拥塞控制窗口大小的调整是无限循环慢启动-指数增长-线性增长 ,初始拥塞窗口后,首先每当接收到一个ACK报文,拥塞窗口就按照值数进行增长,一旦拥塞窗口到达拥塞阈值后,就会变成线性增长,当增长的过程中遇到大量的超时重传,就认为遇到了网络拥塞,我们将拥塞窗口重置为1,拥塞阈值为当前窗口大小的一半,在窗口的变化中,动态窗口根据公式在拥塞窗口和流量控制中动态切换

辅助调节滑动窗口的大小还有: 延迟应答和携带应答

  • 延时应答

延时应答是一种机制,接收方在接收到一个 TCP 段后并不立即发送确认(ACK)报文,而是选择延迟一段时间后再发送 ACK。这段时间通常是为了等待更多的数据到达,从而可能使得ACK与其他数据一起发送
优点:可以减少网络上的 ACK 流量,因为接收方可能不会立即需要发送确认,而是选择在下一个数据包时一起发送确认。减少网络拥塞,提高效率。

  • 携带应答

携带应答是当 TCP 发送方在向接收方发送数据时,将确认应答信息与数据一起发送的一种机制。例如,如果发送方有数据要发送,同时又需要确认收到的数据,它会将 ACK 信息嵌入当前的数据包中。

优点:避免了单独发送 ACK 消息的需要,从而减少了网络开销。提高了网络传输效率,通过将确认信息与实际数据结合,降低了数据包的数量。

八股-异常情况处理

根据TCP的可靠性同时也可以很好的解决TCP异常问题,比如说进程崩溃,主机关机,主机掉电,网线断开中的合理处理

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

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

相关文章

系统之家官网网址:一键直达,安全无忧!

有很多用户反映自己搜搜系统之家,会出现很多网址,不知道哪个才是真正的系统之家官网网址?对于想要访问真正的系统之家官网,获取更多优质系统资源及解决相关系统问题的用户而言,记住系统之家的官网网址是至关重要。以下…

4款文章生成器,自动写作优质文章

在当今信息爆炸的时代,内容创作已经成为网络世界中不可或缺的一部分。然而,随着人们对高质量内容的需求不断增加,传统的手动创作已经无法满足市场的需求。因此,文章生成器应运而生,成为许多从业者和企业的利器。在本文…

公司图纸文件加密超详细的三大步骤,图纸加密软件最新推荐

随着企业信息化建设的不断深入,图纸文件成为了企业核心数据的重要组成部分。特别是在制造、建筑、设计等行业,CAD图纸文件承载了大量的商业秘密和技术机密。一旦这些图纸被泄露或未经授权地访问,企业将面临巨大的经济损失和声誉损害。因此&am…

【已解决】JS Uncaught DOMException: Failed to construct ‘Worker’ 所有场景

【已解决】JS Uncaught DOMException: Failed to construct ‘Worker’ 所有场景 概述 在JavaScript中,Web Workers允许我们运行后台脚本,这些脚本不会影响到页面的性能。然而,当我们尝试创建一个新的Worker时,有时会遇到“Uncau…

时钟同步方案的参考方案

网络时间服务器是为网络设备提供精确、标准、安全、可靠和多功能的时间服务的最佳解决方案,能提供精确的同步时钟信号,支持标准的NTP和SNTP网络对时协议,提供高精度的网络同步时钟直接来自于GPS系统中各个卫星的原子钟。 那么时钟同步方案我…

idea发送请求提示 无法保留 Cookie,cookie storage file is included in ignored list:

你们好,我是金金金。 场景 IDEA插件httpclient发起请求,提示如下 翻译如下:cookie存储文件被列入忽略列表 解决 查看下是不是你把.idea文件忽略显示了,忽略后会不检索 索引不知道所在位置,所以需要把.idea从忽略列表…

【python】如何通过Python中的http.server搭建文件上传下载服务

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

C++系列-泛型编程之类模板

泛型编程之类模板 类模板类模板的定义方式类模板的举例 类模板和函数模板的区别类模板中的成员函数创建时机类模板的对象做函数的参数指定传入类型类中的参数模板化整个类模板化 类模板与继承类模板中成员函数的类外实现类模板分文件编写类模板分文件编写的问题问题原因解决方案…

Java框架myBatis(二)

一、#{}和${}的区别 #{}所采取的时占位符方式(底层是预编译模式),与JDBC中的?方式相同,传参更加方便安全 ,防止了sql注入。当我们需要向sql传值,使用#{}; ${}是将内容直接拼接到sql…

Uniapp 微信小程序,实现页面滚动Tab悬停吸顶,点击tab内容跟随滚动

Uniapp 微信小程序,实现页面滚动Tab悬停吸顶,点击tab内容跟随滚动 页面股东tab悬停原理: 运用uniapp原生提供方法uni.createSelectorQuery()获取滚动对应节点的信息,即节点距离页面顶部的距离,再通过uniapp原生监听页…

【C语言】深入理解指针(一)

指针1 1.内存和地址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和将引用操作符2.3解引用操作符2.4指针变量的大小 3.指针变量类型的意义3.1指针变量类型3.2void*指针 4.const修饰指针5.指针运算5.1 指针- 整数5.2指针-指针3.指针的关系运算 6.野…

《高等代数》最大公因式典型例题

说明:此内容用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:这道题主要从 1)公因式整除多项式的线性组合 2)最大公因式能够被其它公因式整除 3)如果两个多项式互相整除,那就说明这两个多项式相等 这三个知识点出…

Hadoop的HA配置与实现(ZooKeeper)

目录 一、Hadoop的HA架构二、配置实现Hadoop的HA三、效果 一、Hadoop的HA架构 集群规划 112:NameNode1 ResourceManager1 JournalNode1 113:NameNode2 ResourceManager2 JournalNode2 114:DataNode1 NodeManager1 115:DataNode2 N…

如何快速建30个文件夹

文件夹的快速新建只能通过专门的软件来实现,快速建30个,我们可以使用批处理命令,也可以用第三方软件,批处理的命令,需要我们熟悉如何编写,而第三方软件的话不需要那么多的知识,直接在软件上一键…

货运搬家小程序app定制开发过程中需要的主要功能介绍

货运搬家小程序是一个集成了物流服务全过程的数字化解决方案,它通过移动平台提供注册与登录、货物管理、车辆管理、路线规划、货物分配、订单管理、实时追踪、评价与反馈、价格透明等功能。 具体的功能: 注册与登录用户可以通过小程序注册账号并登录&am…

inflight 守恒算法的实现和仿真

前面介绍过,只要某条流的 inflt 在 bdp 之外再增加一个相等的余量 I,即 inflt bdp I,比如 I 2,I 3,…,就一定会收敛到公平,且不会占据过多 buffer,因此 rtt 不会膨胀&#xff0c…

html+css网页设计 动漫 海贼王14个页面

htmlcss网页设计 动漫 海贼王14个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#x…

开放式耳机对耳朵好吗?开放式耳机哪个品牌好?

许多人在选择开放式耳机时并不了解如何选购。对开放式耳机也不是很了解,所以我在这里做个简单的科普和分享。今天跟大家聊聊开放式耳机会伤害耳朵吗?开放式耳机有什么好处?等等,下面一起来看看吧~ 开放式耳机是什么意思&#xff1…

如何有效激活微信陌生客户:加好友后的沟通策略!

在当今这个数字化时代,微信已成为我们与客户建立联系的重要桥梁。对于许多企业和个人而言,成功添加陌生客户到微信列表只是第一步,真正的挑战在于如何有效激活这些潜在客户,转化为实际交易或长期关系。 下面分享一些沟通策略&…

oracle ONS configuration failed NoserversAvailable:Subscription time out导致应用起不来

java.lang.IllegalArgumentException:ONS configuration failed Caused by: oracle.ons.NoserversAvailable:Subscription time out ##已部署到服务器解决方案&#xff1a; 修改这个2个jar包后缀 ##在项目工程里面&#xff0c;<artifactId>ojdbc8</artifactId> m…