网络原理——网络协议

news2024/10/5 16:20:04

目录

  • 传输层协议
    • 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://www.coloradmin.cn/o/416597.html

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

相关文章

学Vue3这一篇就够了!

目录学习Vue的前提是掌握 HTML,CSS,Js中级知识vue介绍声明式渲染条件与循环处理用户输入组件化应用构建Vue与自定义元素的关系应用和组件实例Vue实例根组件组件实例 property生命周期钩子实例的生命周期图模板语法插值文本原始 HTMLAttribute使用 JavaScript 表达式指令参数动态…

不黑学孙溟㠭匪石社寒山寺游记

昔日寒山问拾得曰:世间谤我、欺我、辱我、笑我、轻我、贱我、恶我、骗我、如何处治乎?拾得云:只是忍他、让他、由他、避他、耐他、敬他、不要理他、再待几年你且看他。 经典对话显修行。是否文殊、普贤再来都不重要。因缘使然,朋友…

C++ :JSON 解析系统的设计与实现

JSON JavaScript Object Notation(JavaScript 对象表示法) 定义 存储和交换文本信息的语法,类似 XML; 比 XML 更小、更快,更易解析,属于轻量级的文本数据交换格式; 使用 Javascript语法来描述数据对象,但…

PMP学习笔记

day01 裸考1 题目1: 下列哪一项不属于项目的特征? D A:独特性 B:临时性 C:渐进明细 D:重复性 解析:重复性属于运营 题目2: 在确定项目目标时,应该更加关注哪一个? D A:进度要求 B:成本预算 C:质量标准 D:同等关注进度,成本和质量要求 前沿 管理的基础 三个学…

Hashicorp Vault(金库)

什么是Vault? HashiCorp Vault 是一个基于身份的秘密和加密管理系统。机密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。Vault 提供由身份验证和授权方法门控的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存储和管理、严格控制(限制)和审…

微服务高级篇【1】之微服务保护

文章目录前言一 初识Sentinel1.1 雪崩问题1.2 解决方法1.3 小结1.4 服务保护技术对比1.5 Sentinel介绍1.6 Sentinel安装1.7 微服务整合Sentinel二 测试工具:Jmeter2.1 Jmeter安装和配置2.2 Jmeter快速入门2.2.1 设置中文语言2.2.2 设置Jmeter桌面快捷图标2.3 Jmeter…

Spring————java的反射机制,Spring的IOC和DI

一、认识Spring 1.1、Spring家族 SpringFramework: Spring框架:是Spring中最早核心的技术,也是所有其他技术及的基础。 SpringBoot:Spring是用来简化开发。而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。 SpringCloud&#xf…

FreeRTOS 任务相关 API 函数(一)

文章目录一、任务创建和删除 API 函数1. xTaxkCreate()2. xTaskCreateStatic()3. xTaskCreateRestricted()4. vTaskDelete()二、任务创建和删除实验(动态方法)三、任务创建和删除实验(静态方法)一、任务创建和删除 API 函数 FreeRTOS 最基本的功能就是任务管理,而任…

AcWing4957.飞机降落——学习笔记

目录 题目 代码 AC结果 思路 〇、例子 一、获取数据 二、深度优先遍历(DFS) 1.入参 2.出口 3.判断是否找到安全降落方案 4.递推过程 5.回溯过程 6.DFS完整代码 三、输出打印 题目 4957. 飞机降落 - AcWing题库https://www.acwing.com/pr…

打开 plist 文件

​ 对于使用苹果的进阶或资深玩家来说,有时候要编辑plist文件,比如要弄两个qq,要修改info.plist下的sku,而要是没有工具,就不能随意查看和编辑plist文件了。再有,可能要通过修改plist来破解某些游戏&#x…

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章:【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…

协同数据交换平台详细设计方案(word)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 1 架构设计 1.1 总体架构协同数据交换平台利用企业服务总线、数据抽取ETL、消息中间件、大文件传输等相关技术,包括文件适配器、数据库适配器、Web服务中间件等在内…

【排序算法(四)】归并排序计数排序(非比较排序)以及八大排序算法的总结

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录1、归并排序1.1 算法…

图像处理数据集

BSDS500 Berkeley Segmentation Dataset 500 是第一个用于评估超像素算法的数据集。对于参数优化,使用了验证集。 500张数据集200训练集train100验证集val200测试集test 每张图像有 5 个不同的高质量地面真值分割(groundTruth,是.mat文件) …

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer,它主要用在 audioflinger 里,用来将多路音频源数据混音,以方便送进音频设备播放出来。 音频混音操作本身…

MyBatis(九)MyBatis小技巧

一、#{}和${} #{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。 ${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。…

第09章_异常处理

第09章_异常处理 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班,正常车程1小时。但是,不出…

计网第五章.运输层—TCP流量控制与可靠传输

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、流量控制死锁死锁的解决:二、超时重传时间的选择解决方案Karn算法三、可靠传输补充:其实TCP的流量控制,可靠传输,拥塞控制,都是围绕滑动窗口机制来实现的…

SpringBoot的统一功能处理

目录 1.统一用户的的登录权限校验 最开始的用户登录 Spring拦截器 2.统一数据返回格式 统一数据的返回格式意义 统一数据返回格式的实现 3.统一异常处理 在上篇博客中我介绍了Spring AOP的基础知识,这篇博客则是AOP的实践练习,通过借助AOP实现三个目标 1.统一用户登录权…

VContainer 初体验

IOC 控制反转 IOC 提供一个对象生成容器,在我们需要取得某个对象时,不再使用New关键字进行对象生成操作,而是通过IOC容器内部控制来获得对象。 使用这种思想方式,可以让我们无需关心对象的生成方式,只需要告诉容器我需…