计算机网络八股文之TCP协议

news2024/11/15 14:06:40

TCP/IP模型

  1. 链路层
    1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
    2. 数据链路层:在不可靠的物理介质上保证可靠的数据帧传输,这一层数据叫做数据帧。
  2. 网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。实现点到点的传输。这一层的数据叫做数据报。
  3. 传输层:实现一个端口到另一个端口的数据段传输。实现端到端的传输。这一层的数据叫做数据段。
  4. 应用层:是最靠近用户的层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

MTU和MSS

  1. MTU最大传输单元。不同的层的MTU也是不同的,IP协议的数据报最大为65535个字节,所以当IP数据报大于MTU的时候就需要对数据进行分片,这也是IP协议的主要功能之一。
  2. TCP为了避免被发送方分片,它主动把数据分成小段再交给网络层。最大的分段大小称为MSS(Maximum Segment Size),它相当于把MTU刨去IP头和TCP头之后的大小,所以一个MSS恰好能装进一个MTU中。在三次握手的时候接收方和发送方都会声明自己MSS,因为接收方和发送方的MTU可能是不同的,最终会以较小的MSS为准。
  3. UDP协议没有MSS的概念,传输层的数据可能一股脑的交给网络层,所以数据可能会被分片而影响性能。

TCP

TCP的结构图

  1. 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
  2. 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
  3. 首部长度:占4位,表示4字节*首部长度,最大值为15,表示首部长60字节。
  4.  标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
    • URG:紧急指针(urgent pointer)有效。
    • ACK:确认序号有效。
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。
    • SYN:建立一个新连接。
    • FIN:断开一个连接。

TCP三次握手和四次挥手

三次握手

  • SYN_SEND:客户端socket执行CONNECT连接,发送SYN包,进入此状态。
  • SYN_RECV:服务端收到SYN包并发送服务端SYN包,进入此状态。
  • ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态,服务端接收到ACK包后进入此状态。

四次挥手

  • ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态,服务端接收到ACK包后进入此状态。
  • FIN_WAIT_1:终止连接的一方(通常是客户机)发送了FIN报文后进入。等待对方FIN。
  • CLOSE_WAIT:(假设服务器)接收到客户机FIN包之后等待关闭的阶段。在接收到对方的FIN包之后,自然是需要立即回复ACK包的,表示已经知道断开请求。但是本方是否立即断开连接(发送FIN包)取决于是否还有数据需要发送给客户端,若有,则在发送FIN包之前均为此状态。
  • FIN_WAIT_2:此时是半连接状态,即有一方要求关闭连接,等待另一方关闭。客户端接收到服务器的ACK包,但并没有立即接收到服务端的FIN包,进入FIN_WAIT_2状态。
  • LAST_ACK:服务端发动最后的FIN包,等待最后的客户端ACK响应,进入此状态。
  • TIME_WAIT:客户端收到服务端的FIN包,并立即发出ACK包做最后的确认,在此之后的2MSL时间称为TIME_WAIT状态。

关于四次挥手中TIME_WAIT状态等待2MSL的原因

客户端发送最后的ACK报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

设置端口复用

在server的TCP连接没有完全断开之前不允许重新监听是不合理的。因为,TCP连接没有完全断开指的是connfd(127.0.0.1:6666)没有完全断开,而我们重新监听的是lis-tenfd(0.0.0.0:6666),虽然是占用同一个端口,但IP地址不同。解决这个问题的方法是使用setsockopt()设置socket描述符的选项SO_REUSEADDR为1,表示允许创建端口号相同但IP地址不同的多个socket描述符。在server代码的socket()和bind()调用之间插入如下代码:

int opt = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

为什么是三次握手,不是两次?不是四次?

三次握手的原因(相对两次和四次而言)

  1. 三次握手才可以避免建立多个连接(相对两次)
    1. 三次握手才可以同步双方的初始序列号,MSS,窗口大小等信息,两次握手最多建立一个单向的连接。
  2. 三次握手才可以避免资源浪费
    1. 相对于四次握手而言,减少了连接次数;相对于两次,避免了冗余连接

为什么不是两次?

  1. 无法防止历史连接的建立,会造成双方资源的浪费
  2. 无法可靠的同步双方序列号

为什么不是四次?

  1. 三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数(四次握手讲三次握手的第二步拆成了两步,没必要这样做)

TCP的流量控制

接收方为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收的一种流量控制方法。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面,由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。

滑动窗口详解

TCP的拥塞控制

拥塞控制是发送方为了避免因为网络拥塞而导致分组丢失所采用的一种发送速率的控制方法。发送方需要根据网络拥塞情况维护一个叫做拥塞窗口(cwnd)的状态变量,控制当前的发送速率。

TCP 主要通过四个算法来进行拥塞控制:

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

慢开始与拥塞避免

  1. 发送的最初执行慢开始,令 cwnd = 1,当收到确认后,将 cwnd 加倍,2、4、8 ...
  2. 设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
  3. 如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

快重传与快恢复

  1. 在发送方,如果收到三个重复确认,此时执行快重传,立即重传下一个报文段。
  2. 执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

流量控制和拥塞控制的区别

  • 流量控制属于通信双方协商;拥塞控制涉及通信链路全局。
  • 流量控制需要通信双方各维护一个发送窗、一个接收窗,对任意一方,接收窗大小由自身 决定,发送窗大小由接收方响应的TCP报文段中窗口值确定
  • 拥塞控制的拥塞窗口大小变 化由试探性发送一定数据量数据探查网络状况后而自适应调整。
  • 实际最终发送窗口 = min{流控发送窗口,拥塞窗口}

TCP粘包、拆包以及解决办法

粘包/拆包

接收端只收到一个数据包,但是这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。(TCP包中数据的粘合!不是TCP包的粘合,TCP包通过首部能区分开)这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。

为什么会发生 TCP 粘包、拆包?

  • 发送的数据大于 TCP 发送缓冲区剩余空间大小,拆包。
  • 发送数据大于 MSS(最大报文长度),拆包。
  • 发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,粘包。
  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,粘包。

解决办法

由于 TCP 本身是面向字节流的,无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,归纳如下:

  • 消息定长:发送端将每个数据包封装为固定长度(不够的可以通过补 0 填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
  • 设置消息边界:服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如 FTP 协议。
  • 将消息分为消息头和消息体:消息头中包含表示消息总长度(或者消息体长度)的字段。

TCP心跳机制

tcp维护长连接,一般是在应用层引入心跳机制。就是每隔一段时间发一个探测包,看连接是否顺畅,来确定连接的可用性。

TCP如何实现可靠传输的?

  1. 序列号:保证按序交付
  2. 检验和:保证数据不出错
  3. 流量控制、拥塞控制:调控双方的发送速率,防止因为网络阻塞,缓冲区满等原因丢包
  4. ACK确认机制、超时重传:保证每一个字节段的交付。 

UDP

UDP结构图

TCP和UDP对比

  1. 是否面向连接 :UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接。
  2. 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
  3. 传输效率 :由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
  4. 首部开销 :TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。
  5. 是否提供广播或多播服务 :TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;
  6. 是否有状态 :这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情。
  7. 传输形式 : TCP 是面向字节流的,UDP 是面向报文的。

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

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

相关文章

WPS Office for Linux 12 个人版上线deepin 23商店:UI 视觉重构,新增多项 AI 功能

查看原文 全新WPS Office For Linux个人版(12.1.0.17881)与deepin 23的AI功能深度融合,正式上架在社区商店啦! 这是 Linux 版本的一次里程碑式的重大更新。在产品能力层面上,在 deepin 23 上WPS Office 几乎实现了与 …

30天一次过PMP资料分享!2024备考PMP必看!!!

1、华为项目管理工具模板 2、PMP思维导图 3、PMBOK指南第七版-中文电子版 4、敏捷电子书(含敏捷实践指南) 5、300道敏捷题 6、PMBOK第六版章节思维导图 PMP备考攻略: 1. 充分了解PMP考试大纲: 详细了解PMP考试大纲,明…

IEEE Latex模板子图标题字体修改

在进行IEEE期刊论文排版时,可能会用到子图,但官方的Latex模板中,子图标题字体与字号和图片标题不同,排版出来不美观,下面介绍一个简单方法解决这一问题。 在tex文件头部找到这一条代码: \usepackage[capti…

Spring学习(四)-AOP

Spring学习(四)-AOP –2020年06月26日 一、AOP的概念 面向切面编程。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述&am…

Mendix 创客访谈录|Mendix赋能汽车零部件行业:重塑架构,加速实践与数字化转型

在当前快速发展的技术时代,汽车行业正经历着前所未有的数字化转型。全球领先的汽车零配件制造商面临着如何利用最新的数字技术优化其制造车间管理的挑战。从设备主数据管理到生产执行工单管理,再到实时监控产量及能耗,需要一个灵活、快速且高…

IF 17.1| 爱竹人士一眼就心动的数据库!

竹子具有重要的经济和生态重要性,并为国际贸易做出贡献。BambooGDB是现有的竹基因组学资源,提供了基于毛竹个体参考基因组草图的信息。然而,我们需要的是一种资源来加强竹科多基因组组装,使研究人员能够通过分支特异性比较基因组研…

Qt基础类02-坐标类QPointF

Qt基础类02-坐标类QPointF 摘要基本信息重要成员函数举例6个程序全貌QPointF::QPointF()static qreal QPointF::dotProduct(const QPointF &p1, const QPointF &p2)bool QPointF::isNull() constconst QPointF operator*(const QPointF &point, qreal factor)const…

程序员都必须要知道的 8个常见数据结构

1. 数组:多功能主力 什么是数组? 数组可能是编程中最基本、使用最广泛的数据结构。将数组视为存储在连续内存位置的项目集合。它就像学校里一排储物柜,每个储物柜(元素)按顺序编号,可容纳一个物品。 数组…

Qt实现图表绘制

来来来,今天新学习到了一个好东西,就是图表的绘制,这玩意在一般的项目开发中的使用频率还是非常高滴,毕竟相对于数字来说,这个东西更能体现出数据的变化,主要是耐看啊!!!…

9月跨境营销热点日历!出海选品指南

9月1日 澳大利亚父亲节 澳大利亚父亲节是一个特殊的日子,人们用来表达对父亲的感激之情。 礼物用品:手表盒、雪茄盒、红酒架、腰带等。除了前面举例的几款,还能从哪里获取选品的灵感呢?店雷达给大家提供一些实操的选品思路&…

p38激酶在癌症研究中的进展

前 言: p38是丝裂原活化蛋白激酶MAPK家族的重要成员。p38的激活需要在Thr180、Tyr182位点发生磷酸化,在细胞增殖、代谢、凋亡等方面发挥重要作用,与多种肿瘤发展相关。 MAPK(丝裂原活化蛋白激酶)通路参与调控与癌症发…

【Linux】常见指令及权限相关知识详细梳理

1.Linux基本指令 1. ls指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。 对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件&#xf…

ARM V2微架构

简介 今年V3/N3已经发布,但考虑到没有公布太多的细节,我依据手册在“ARM发布新一代高性能处理器”一文中对微架构有阐述,本文主要简单分析ARM V2的一些微架构内容。 IFU 1、每个cycle预测两个分支,这个特性在服务器系列中是N2/V…

vue数字滚动插件vue-countTo

文章目录 1. vue-countTo2. 使用2.1 安装2.2 页面使用 3. 参数4. 方法 1. vue-countTo 这是一个 vue 组件,它会在指定的时间内计数到目标数字 vue-countTo 是一个无依赖的轻量级 vue 组件,可以自行覆盖 easingFn,可以设置 startVal 和 endVal…

【无标题】如何申报团体标准,需要具备哪些条件

在当今快速发展的社会中,团体标准的重要性日益凸显。它不仅能够推动行业的进步与创新,还能提升企业的竞争力。那么,如何申报团体标准呢?又需要具备哪些条件呢?让我们一同来深入了解。 申报团体标准的流程和所需条件可能…

如何让工作汇报不再平庸?

在职场中,工作汇报是每位员工不可或缺的一部分,它不仅是展示个人成果与能力的窗口,也是促进团队沟通与协作的重要桥梁。 1、明确目标与听众 不同的听众有不同的关注点和期望,了解他们的背景和需求,能够让你在汇报中有…

创客匠人9月活动|预告

-----------------------------------------创客匠人:让知识变现不走弯路-----------------------------------------

7月刷题笔记

刷题笔记—7月 1512.好数对的数目(哈希) class Solution { public:int numIdenticalPairs(vector<int>& nums) {int cnt 0;unordered_map<int, int> hash;//nums[i]---个数for(int i 0; i < nums.size(); i) {cnt hash[nums[i]];hash[nums[i]];}return…

【鸿蒙】HarmonyOS NEXT星河入门到实战1-开发环境准备

目录 一、达成目标 二、鸿蒙开发环境准备 2.1 开发者工作下载 2.2 解压安装 2.3 运行配置安装node.js和SDK 2.4 开始创建第一个项目 2.5 预览 2.5.1 预览遇到的问题&#xff08;报错&#xff09; 2.5.2 修改内容查看预览 三、备用下载地址&#xff08;如果下载是4.X版…

Android平台RTSP|RTMP播放器(SmartPlayer)集成必读

技术背景 好多开发者拿到大牛直播SDK的Android平台RTSP、RTMP播放模块&#xff0c;基本上不看说明&#xff0c;测试后&#xff0c;就直接集成到自己系统了。不得不说&#xff0c;我们的模块虽然接口很多&#xff0c;功能支持全面&#xff0c;但是上层的demo设计逻辑确实简单&a…