网络原理——网络协议

article/2025/9/28 23:42:18

目录

  • 传输层协议
    • TCP协议
      • TCP协议格式段
      • TCP原理
        • 连接管理
        • 可靠传输
        • 流量控制
        • 拥塞控制
        • 延迟应答和捎带应答
        • 错误检测
        • TCP异常
    • UDP协议
      • UDP协议格式段
      • UDP协议特点
        • 无连接
        • 不可靠
        • 面向数据报
        • 大小受限
  • 网络层协议
    • IP协议
  • 数据链路层协议
    • ​以太网
    • MTU
    • ARP协议

传输层协议


传输层负责数据能够从发送端传输接收端。传输层协议主要包含TCP协议和UDP协议。

TCP协议

TCP协议格式段

TCP协议格式段为:
在这里插入图片描述
各部分含义为:

源端口号(16位):标识发送方的端口号。
目的端口号(16位):标识接收方的端口号。
序列号(32位):用于标识发送的数据的顺序。
确认号(32位):用于确认接收到的数据。
数据偏移(4位):指示TCP报文头部的长度。
保留(6位):保留未来使用。
标志位(6位):

  • URG:优先发送该报文,不再按序发送。
  • ACK:确认应答。
  • PSH:立即推送报文,不再等缓冲区填满。
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文
  • SYN:请求建立连接;我们把携带SYN标识的称为同步报文
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文

窗口大小(16位):指示接收方可接受的数据量。
校验和(16位):用于检测数据传输中的错误。
紧急指针(16位):仅在URG标志设置时有效,用于指示紧急数据的位置。
选项(可变长度):用于支持各种可选功能。

TCP原理

TCP协议的原则:保证数据传输安全的前提下,尽可能的提高传输效率。

连接管理

TCP协议使用三次握手建立连接,四次挥手断开连接。
三次握手:发送方请求连接(发送SYN,即同步报文)->接收方确认请求(收到请求后,发送ACK,即确认应答)->接收方请求连接(发送SYN)->发送方确认请求(收到请求后,发送ACK):
三次握手
这里接收方的两条指令因为间隔很短,两条指令会一起发送过去。因此接收方的ACK+SYN算作一次握手。
四次挥手:上述图中的SYN换成FIN(结束报文)即可。但是接收方的ACK和FIN指令一般不能合并,因此称为四次挥手。
为什么SYN与FIN不能合并?其主要原因在于接收方必须等到发送方关闭资源(也就是close)后才能发送FIN指令,假如close是立即执行的,那么FIN就可以和ACK合并,但是close可能要一会才能执行(或者根本不执行),那么FIN显然就不能和ACK合并,只能单独发送了。(FIN有可能与ACK合并的原因就在与TCP的延迟应答机制,TCP的ACK指令不会立即执行,而是稍微等待一会才执行。)
为什么需要三次握手?
三次握手是为了保证发送方和接收方的接受能力和发送能力都正常。假如A与B进行语音通话,A首先说话:“能听到吗?”,B此时听到了A说的话(代表B知道了A的麦正常,B的耳机正常),B回应:“能听到。”,B又说:“那你能听到我说的话吗?”,A能听到(说明A知道了A的麦正常,B的麦正常,A的耳机正常),但是A还要回应:“能听到”。(B知道了B的麦正常)。
在这里插入图片描述

可靠传输

TCP协议使用序列号和确认号来保证数据的有序传输和丢包重传,以实现可靠传输。每次传输都需要ACK确认应答,发送方收到了ACK,才能确定数据成功传输了过去,以此来保证数据传输的可靠性。假如发送方没有收到接收方的ACK,那么发送方就会认为此次数据传输是失败的,发送方就会重新传输一次——这依赖于TCP的超时重传机制:当超过最大等待时间后发送仍没有收到ACK,就进行数据重传。
当然,有两种情况会导致发送方没有收到ACK:发送方在发送途中丢包了(这种情况就只能超时重传了);接收方成功的收到了数据,但是返回的ACK没有传过去(这种情况就不能超时重传了)。
不过超时重传机制并不会考虑是否哪一种情况导致的未收到ACK,是因为TCP拥有自动去重功能,也就是传过去的数据只能接收一次,第二次传过去,接收方就不再接收了。
为了保证有序性,TCP为每个字节的数据都进行了编号,即为序列号。ACK是对接收到的数据的最高序号的确认,并返回下次期望接收到的序列号,从而保证数据的有序。

流量控制

TCP为了保证可靠传输,需要牺牲很多的效率。但是TCP协议的原则是:保证数据传输安全的前提下,尽可能的提高传输效率。如果按照一问一答的方式,假如一次传输1000个字节,就要等这1000个字节都传输到位,再接着传输1000个字节:
在这里插入图片描述
这种传输效率明显很低,要提高效率,可以采用一次传输多条数据的方式:
在这里插入图片描述
这样就可以有效地减少等待的时间了,但是一次同时传输多少条数据呢?在TCP协议报头中,有一个16位字段的窗口大小,就是滑动窗口,窗口的大小实际上是接收数据缓冲区的剩余大小。滑动窗口的大小就是每次传输的最大数据量。滑动窗口满了以后,发送ACK,并在缓冲区删除这条数据,这时缓冲区就会有剩余空间,发送端就可以接着传输数据。
接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包的情况。因此发送方传输数据的速度会根据滑动窗口的大小来动态调整,也就是流量控制
接收端会把当前缓冲区的大小放入TCP头部的窗口大小中,通过ACK来告知发送端窗口大小,发送端看到窗口较小时就会降低发送速度,相反会增大发送速度。假如缓冲区满了,返回的窗口大小就为0,此时发送端就会停止发送,但是会定期发送一个窗口探测数据段,使得接收端告知缓存区大小,一旦不满则继续发送。
当然,即使有了流量控制,也不能百分百的避免丢包的情况。
假如出现丢包情况怎么办?
如果是数据没有传过去,假如1~1000没有传过去,那么发送端会一直收到接收端的提醒:“下一个是1001”,直到接收到1~1000的数据返回ACK。多次提醒后发送方会重新发送1~1000这段数据。后面没有发生丢包的会正常接收,当1~1000这条数据重新发送且被收到后,接收方接收到了哪条数据,就返回哪条数据的下一个ACK,例如:1~1000丢了,后续数据正常传输,等到这条数据被接收后,已经接收到了5000条,这时ACK返回的就是:“下一个是5001”。
如果仅仅是ACK丢了,可以通过后续的ACK进行确认,不需要重新发送。

拥塞控制

在数据开始传输时,即使有了滑动窗口,也不能直接传输一大批数据,因为我们并不知道当前的网络拥堵情况,很可能当前的网络已经比较拥堵了,如果此时贸然地传输一大批数据,必然会造成大量的丢包现象。因此TCP引入了慢启动机制,先发送少量的数据,探测当前的网络情况,再逐步的增大传输速率。
这时就引入了拥塞窗口:拥塞窗口的大小根据网络拥塞情况动态变化。
它的变化分为几个阶段:慢启动、拥塞避免、快速重传、快速恢复。

  • 慢启动:主机开始发送数据时,首先探测一下网络的拥塞情况,即逐渐增大拥塞窗口。通常开始会把窗口大小设置为刚好容纳一个最大报文段MSS(Maximum Segment Size)的数值,每收到一个ACK,把拥塞窗口增加至多一个MSS的大小(每个报文段都会收到一个确认,因此每次窗口大小会翻倍),因此在前期,窗口大小会按照指数增长。
  • 拥塞避免:当拥塞窗口达到一定阈值(慢启动门限,ssthresh)后,就会进入拥塞避免阶段。在该阶段,拥塞窗口会线性增长,即每经过一次往返,只增加1个MSS大小。这样可以尽可能地达到网络拥塞的临界值。
  • 快速重传: 当发送方收到第三个重复的ACK时,就认为数据报丢失,会立即重传,而不用等待超时。快速重传把阈值设置为当前拥塞窗口的一半,同时把拥塞窗口置为1,接着进入慢启动阶段。
  • 快速恢复:当发送方收到第三个重复的ACK时,就认为数据报丢失,此时执行快速恢复算法:调整阈值的大小,将其设置为当前拥塞窗口的一半,把拥塞窗口设置为新的阈值加上3个MSS大小,然后重新发送数据报,在收到ACK后,重新进入拥塞避免阶段。
    拥塞窗口图解
    实际上,发生丢包时,会优先使用快速重传算法重传数据报,然后使用快速恢复算法调整拥塞窗口大小。
    每次发送的数据报,大小都不能超过拥塞窗口和接收方反馈的窗口大小的最小值。

延迟应答和捎带应答

为了保证滑动窗口尽可能大,ACK的确认应答采用了延迟应答。假如我们往缓冲区放了1k个字节,如果立即ACK,那么这1k个字节的空间就用不了了,如果稍微等一下,这1k个字节可能就被处理掉了,此时返回的窗口大小就更大了。基于延迟应答机制,像上述的断开连接四次挥手就有可能变为三次挥手。(ACK延迟应答,而close正好在这期间执行完毕,因此FIN可以和ACK一起应答,即捎带应答

错误检测

TCP协议使用校验和来检测数据报的传输过程中是否出现错误。发送数据报之前,发送方首先计算数据报的校验和,并存储在报文的校验和字段中,接收方接收数据后,会重新计算校验和,并与TCP报文中的校验和进行比较,如果校验和不同,说明传输出现了错位。

TCP异常

非正常断开连接中,进程终止和机器重启不会造成TCP断开连接异常,结束时仍然会正常发送FIN,(FIN是由传输层控制的,与进程无关),假如收到FIN后没来得及ACK就关机了,此时,接收端会尝试重发FIN,重发几次后会充值连接,还不行的话就断开连接。
但是假如发生了断电或断网的情况,发送端来不及发送FIN报文,因此接收方认为连接还在。但是TCP有一个心跳包保活机制,会定期的询问对端是否还在,如果对端不在,就会断开连接。

UDP协议

UDP协议较TCP简单很多,其主要优点是传输速度块。

UDP协议格式段

UDP协议格式段

UDP协议特点

无连接

基于UDP协议的传输不需要连接,只需要知道对端的IP和端口号就可以传输。

不可靠

UDP传输不考虑对方是否收到,因此可以一次性发送大批数据。当然如果发生了丢包问题等,UDP没有相应的补救措施。

面向数据报

UDP每次传输和接收必须以一个数据报的形式接收和发送,假如这个数据报中有100个字节,读取时一次就只能读取100个字节而不能1个一个读或者10个10个读。

大小受限

UDP每次传输的数据大小最大是64k,如果传输的数据大于64k,最常用的方法是在应用层进行分离和组装(拆分成小于64k的大小);或者按大包的形式发,在数据链路层再进行分包和组包。

网络层协议

网络层协议主要是IP协议,作用是确定网络传输的路径。

IP协议

IP协议格式段
IP协议格式段
版本:用来标识IP的版本号,目前有IPV4和IPV6两个版本。
首部长度:用来表示IP协议的头部长度。大小为4个字节,一个字节表示的最大数为1111(即15),所以首部长度最大值是60个字节。最常用的首部长度是20个字节。
服务类型:用来获取更好的服务。由三位优先权字段(已弃用),四位TOS位,和0组成。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能从中选择一个。

服务类型(Type of Service)字段实际上从未使用过。1988年IETF把这个字段改名为区分服务(Differentiated Services),并对其重定义:把前六位定义成DSCP(Differentiated Services Code Point),后两位保留。因此该字段现在通常称为DS字段。

数据报总长度:IP数据报整体占用字节数。
标识符:唯一地标识主机发送的报文。假如要发送的报文长度大于数据链路层支持的最大长度,即超过最大传输单元(MTU)(如果是以太网则为1500个字节),则报文就需要被分割成几部分再进行传输,这些被分割的部分都带有相同的标识符(id),表示这是一个报文。
标志位:第一位保留后用;第二位表示该包是否允许分片(1表示不允许此时如果该包长度大于最大传输单元,将该包丢弃,同时返回发送者ICMP错误);第三位表示是否为最后一个分片,如果是则为1。
片位移:也叫偏移量。当IP分片以后,各个部分传输的时间并不相同,有可能后发先至,因此每个分片的偏移量都不相同,最后根据偏移量对包进行重组。(与TCP原理类似)
生存时间:表示到达目的地最多要经过的节点个数(TTL,一般是64),每经过一个节点(路由器),TTL-1,TTL为0时还没到达目的地,就认为路由寻址出现了问题(可能出现了死循环),此时会丢弃该报文,并通知发送方。
协议:用来表示上层协议类型。
校验和:校检IP协议头部,判断运输是否正常。
源IP:32位,表示数据报源IP。
目的IP:32位,表示数据报目的IP。
选项:可选字段,可以更改一些可选的报头格式,如果更改首部长度,需要保证长度为4的倍数。

数据链路层协议

数据链路层最常用的协议是Etnernet以太网协议

​以太网

以太网是一种计算机局域网技术,它规定了包括物理层的一些内容,以太网是应用最普遍的局域网技术。
以太网帧格式
以太网帧格式
源mac地址和目的mac地址表示的是网卡硬件地址,(物理地址,该地址跟随网卡出厂就设定好了,不可更改)用来表示每段传输的起点和终点。
帧协议类型字段有三种值:分别对应IP、ARP、RARP;
CRC:校验和,检验传输是否正常。

MTU

MTU,即Maximum Transmission Unit,意为最大传输单元。不同的数据链路层协议MTU不相同,以太网的MTU为1500个字节。
MTU的作用是限制每次传输数据报的大小,MTU会影响上层协议的传输。

ARP协议

ARP协议建立了IP与mac的映射关系。每次传输时通过IP地址在本地ARP缓存表中查找目的mac地址,如果找到了,直接传输到目的mac地址即可,如果没有找到,则进行广播查找目的mac地址。


http://chatgpt.dhexx.cn/article/9mYTFu1d.shtml

相关文章

网络原理 2

文章目录 1. 网络层2. 数据链路层3. DNS 前言 : 上文已经 将 网络层 和 传输层 说完了, 下面我们来学习以下 网络层 和 数据链路层 里 相关的知识 , 关于 网络层 和 数据链路层 的知识 简单了解一下即可 . 1. 网络层 网络层 主要 做两件事 : 1.地址管…

计算机网络原理最详细解说

一、计算机网络概述 时代不同了,大家现在生活都好了,家家户户基本都有电脑,而且我们都习惯了使用电脑办公,打打游戏,聊聊天等等。 那我们一起来想一个场景:如果没有了网络,我们是不是就不能使…

[网络原理] 网络中的基本概念

人生,本就是苦乐参半,这样的生活才是丰富多彩. 文章目录 前言1. IP地址2. 端口号3. 协议4. 五元组5. 协议分层6. OSI七层模型7. TCP/IP协议8. 封装和分用9. 客户端与服务端10. 请求与响应 前言 本章开始,我们开启网络部分的知识大门. 1. IP地址 1.定义: IP地址主要用于表示网…

网络原理-网络发展史和通信基础

目录 1.网络发展史 面向终端的计算机网络 计算机网络阶段(局域网LAN) 组网方式 计算机网络互联阶段(广域网WAN) 2.通信基础 IP地址 端口号 网络协议 协议的作用 知名协议的默认端口 协议分层 分层的作用 OSI七层模型 TCP/IP五层模型 网络设备所在分层 网络分层…

【Linux】网络原理

本篇博客让我们一起来了解一下网络的基本原理 1.网络发展背景 关于网络发展的历史背景这种东西就不多bb了,网上很容易就能找到参考资料,我的专业性欠缺,文章参考意义也不大。这里只做简单说明。 网络发展经过了如下几个模式 独立模式&…

计算机网络 ——网络原理之初识

✨计算机网络 ——初识网络原理 作者介绍: 🎓作者:偷偷敲代码的青花瓷🐱‍🚀 👀作者的Gitee:代码仓库 ✨✨我和大家一样都是热爱编程✨,很高兴能在此和大家分享知识,希望在分享知识的同时,能和大家一起共同进步,取得好成绩&#x…

计算机网络原理简介

物理层 电脑要联网,需要做什么,电脑需要电, 然后电脑与电脑之间相连,需要网,可以用光纤,双绞线,同轴电缆,无线波等 把电脑连接起来的物理手段,主要规定了网络的一些电气特性,作用是负责传送0和1的电信号.而机械特性,及时如何去与硬件相连了,比如说插座的尺寸 数据链路层 物…

快速了解网络原理

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 局域网和广域网 局域网 局域网组建的方式 广域网 网络通信基础 IP地址 端口号 协议 什么是协议 协议分层 分层模型 OSI七层模型 TCP/IP…

网络原理 (1)

网络原理 文章目录 1. 前言: 2. 应用层2.1 XML2.2 json2.3 protobuffer 3. 传输层3.1 UDP3.1 TCP4. TCP 内部的工作机制 (重点)1. 确认应答 2.超时重传3. 连接管理3.1 建立联系 :三次握手3.2 断开连接 : 四次挥手 4. 滑动窗口5. 流…

网络原理初识(基础)

目录 一,网络的划分 1.局域网(LAN) 概念 局域网的组建(连接方式) 2.广域网(WAN) 概念 二,网络通信基础 1.IP地址 概念 格式 组成 分类 特殊IP 2.端口号(po…

网络基本原理

一、网络与网卡 网络:进程与进程间跨主机(Host)通信 网卡: 网卡发送数据:1.填充数据 2.触发发送 网卡接收数据:1.接收数据 2.通过中断把控制权交给OS 3.OS把数据搬给进程 数据经过不断的封装之后才能发…

安装vue-devtool

新买了台电脑,想要安装vue-devtool,发现安装不上,特此记录下。 一,下载 因为某种大家都知道的原因,外网上不了。 可以使用这里的下载地址: https://chrome.zzzmh.cn/info?tokenljjemllljcmogpfapbkkighb…

嵌入式linux之yocto(六)devtool往返开发

1. 参考 yocto官方文档-devtool 微信读书:嵌入式Linux系统开发:基于Yocot Project 书中对于devtool讲解较少,官方文档对devtool的工作流和使用方法较为详细。 传统开发内核是直接进入内核路径修改源码,这里简述使用devtool工具开发Linux内核…

Chrome Devtool 调试 Javascript

重现错误 单击打开演示。演示在新选项卡中打开。在 Number 1 中输入数字5在 Number 2 中输入数字2点击 Add Number 1 and Number 2 熟悉 Sources 面板 UI 点击Source get-started 是 get-started.html(不包括JS) get-started.js 就是 get-started 的…

devtool使用介绍(2)

devtool使用介绍2 2.4.2 使用devtool Modify修改现有组件的来源 2.4.2 使用devtool Modify修改现有组件的来源 devtool Modify命令为使用已有代码的现有代码作准备,该代码已具有用于构建软件的本地recipe。 该命令足够灵活,可让你从上游源提取代码&…

webpack——devtool配置及sourceMap的选择

官方手册传送门 官方对devtool配置的定义很简单:选择一种 source map 格式来增强调试过程,不同的值会明显影响到构建build和重新构建rebuild的速度。 不过,什么是source map,官方用提供了许多种的source map,其中的区…

webpack:devtool配置中的source map

webpack:devtool配置中的source map 一、功能作用二、配置文件三、source map格式(1)source-map(2)inline-source-map(3)hidden-source-map(4)eval-source-map&#xff0…

sourceMap: devtool 模式以及SourceMapDevToolPlugin的使用

1. 什么是sourceMap sourceMap 是一个信息文件, 维护着代码转换编译前后的映射关系; 2. devtool : 选项控制是否生成,以及如何生成 source map source Map对应的模式 1)inline 2) cheap 3)module 4) eval 5) source-map …

webpack之devtool

关于Devtool 该选项控制是否以及如何生成源映射。官网上给出的可选值有: 其中一些值适合开发,一些用于生产。对于开发,您通常需要快速的Source Maps,以bundle的大小为代价,但是对于生产,您需要独立的Sourc…

chrome devtool使用基础

保存js和css setting > workspace 工作区设置后,自动映射工作区 带绿色图标的文件,不需要请求 blackbox script 黑盒调试,调试不进入第三方代码,只调试项目代码 setting > blackbox 或者鼠标右键设置 network throttling profile 设置网络模式,网速限制,在ne…