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

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.mzph.cn/pingmian/52441.shtml

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

相关文章

中科服务器磁盘未断电状态被人拔插导致raid故障,安装系统找不到系统盘 修复raid再次安装系统成功

1,根据提示按del进入bios 直接回车 改成good状态保存(多块盘的话重复此操作即可,直到让盘的状态显示good或者online) 然后回到上级导入raid信息 raid信息导入 设置成yes,然后保存退出 然后他会自己同步数据&…

Linux 软件编程多路复用tcp

1.select的缺点: 1.select监听的文件描述符集合是一个数组,有上限(1024个) 2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…

【Linux】分析一段oom及oops报错日志

oom相关日志分析: Oom-killer错误是因系统内存分配不足,为保障系统正常运行会随机kill掉占用较多的内存进程。 该日志已经输出内存占满相关提示,内存上限为16G,当前已使用16G,内存限制导致分配失败次数为586755次。 OOPS相关日志…

交换排序(冒泡排序和快速排序)

一、基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 二、冒泡排序 1.核心思想 两两相邻的元素进行比…

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发与商用化进程渐渐成为了当前科技领域的热点与焦点。在5G技术尚未完全普及的今天,全球各国已纷纷将目光投向了更加充满想象的6G网络时代。本文将探讨全球6G研发的最新进展,特别是欧盟与…

Linux进程间通信——互斥锁与信号量详解

文章目录 互斥锁信号量整形信号量记录形信号量利用信号量实现进程互斥利用信号量实现同步利用信号量实现前驱关系 互斥锁 现实中的锁有两种状态,打开和关闭,分别对应这资源可以被使用,和不可以被使用,我们可以通过使用钥匙对锁的…

<数据集>考场行为识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2192张 标注数量(xml文件个数):2192 标注数量(txt文件个数):2192 标注类别数:2 标注类别名称:[cheating, good] 序号类别名称图片数框数1cheating128214412good1067…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题,因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源,同时保持高度的安全性和合规性。以下是一些关键技术和实践方法,用于实现跨云环境下的自动化身份管理…

Linux驱动开发基础(中断)

所学来自百问网 目录 1. 嵌入式中断系统 2. 中断处理流程 3. 异常向量表 4. Linux系统对中断的处理 4.1 ARM 处理器程序运行的过程 4.2 保护现场 5. Linux 系统对中断处理的演进 5.1 硬件中断和软件中断 5.2 中断拆分(上半部和下半部) 5.2.1 tasklet 5.2.2 工作队列…

git笔记:git常用命令备忘录

1、工作区域和文件状态 1.1、工作区域 git的数据管理分为四个区域: 工作区(Working Directory) 本地工作目录,是我们电脑上的目录,是我们实际编写代码的区域,修改完工作区的文件后可以使用git add命令将…

72 华为资源库

1 报文格式 https://info.support.huawei.com/info-finder/tool/zh/enterprise/packetformat 2 华为IP网络电子书 资源可以下载 https://e.huawei.com/cn/topic/enterprise-network/ip-ebook 3 华为产品文档 https://support.huawei.com/enterprise/zh/doc/index.html 4 华为…

Facebook的AI助手:如何提升用户社交体验的智能化

在现代社交媒体平台中,人工智能(AI)的应用正逐渐改变人们的社交体验。Facebook作为全球最大的社交媒体平台之一,已在AI技术的开发与应用上投入了大量资源,并通过其AI助手为用户提供了更加个性化、智能化的互动体验。这…

vagrant 创建虚拟机

创建一个名为 “Vagrantfile” 的文件,修改如下内容: Vagrant.configure("2") do |config|(1..3).each do |i|config.vm.define "k8s-node#{i}" do |node|# 设置虚拟机的Boxnode.vm.box "centos/7"# 设置虚拟机的主机名…

逆向中的游戏-入土为安的第二十五天

逆向中的游戏 CE的介绍 Cheat Engine ,简称CE,是逆向工程师常用的几大神器之一,也是游戏汉化、破解以及外挂编写中常用的工具,其功能包括:内存扫描、十六进制编辑器、调试工具,可以进行反汇编调试、断点跟…

代码随想录算法训练营_day28

题目信息 122. 买卖股票的最佳时机 II 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/题目描述: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你…

matlab 计算复共轭

目录 一、概述1、算法概述2、主要函数二、代码示例1、求复数的复共轭2、求矩阵中复数值的复共轭三、参考链接本文由CSDN点云侠翻译,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、概述 1、算法概述 2、主要函数 Zc = conj(Z)返回 Z …

【python】Python中小巧的异步web框架Sanic快速上手实战

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

Git在IDEA中的集成操作(附步骤图)

1.先做适配操作,将安装的Git软件关联到IDEA中 点击Test之后若成功会显示出Git版本: 2.创建版本仓库 3.创建新的版本 3.1将文件提交到暂存区(不重要) 第一种方式:菜单栏提交 第二种方式:项目右键提交 4.查看历史版本信息 目…

整合sentinel遇到的小问题

1.运行jar包 ,端口为默认8080 正确命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.server127.0.0.1:8090 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.6.jar -D这些指令要在 -jar前面 在宝塔部署时,直接复制到运行命令后…

Sparse Kernel Canonical Correlation Analysis

论文链接:https://arxiv.org/pdf/1701.04207 看这篇论文终于看懂核函数了。。谢谢作者