计算机网络 TCP&UDP、IP、ARP&RARP、NAT总结

文章目录

TCP 和 UDP

UDP

目标端口和源端口:告诉UDP应该发送至哪个进程

包长度:UDP首部的长度跟数据的长度之和

校验和:提供可靠的UDP首部而设计

TCP

窗口大小:还有多少空间能接收数据

标志字段:

ACK:用于指示确认应答号值是否有效,置1表示包含一个对已成功接收报文段的确认;

RST:用于重置一个已经混乱的连接,或拒绝一个无效的数据段或者连接请求;

SYN:用于连接建立过程,请求建立一个连接;

FIN:用于断开连接,表示发送方没有数据要传输了

校验和:CRC算法检测报文段是否出错

TCP 三次握手

⚠️upload failed, check dev console

![[image-20240817204352841.png]]

第一次握手: 携带客户端初始序列号的SYN报文

第二次握手: 携带服务端初始序列号的SYN+ACK报文,表示收到

第三次握手:携带服务器的ACK报文

为什么需要三次握手?

三次握手才能保证双方具有接收和发送的能力

总结:

  1. 三次握手才可以阻止重复历史连接的初始化(主因)
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费

半连接队列(SYN队列)

用于存放已经发送了 SYN(同步)包,但还未完成三次握手的连接:服务器第一次收到客 户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接 放在一个队列里,我们把这种队列称之为半连接队列。

全连接队列(Accept队列)

用于存放已经完成三次握手,处于完全建立连接状态的连接。

TCP四次挥手

在挥手之前,客户端和服务器都处于 ESTABLISHED 状态

  1. 第一次挥手:假设客户端打算关闭连接,发送一个TCP首部FIN被置1的 FIN 报文给服务端, 此时客户端处于 FIN_WAIT1 状态
  2. 第二次挥手:服务端收到以后,向客户端发送ACK应答报文,且把客户端的序列号值+1作为ACK报文的序列号 值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态
  3. 第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。此时服务端处于 LAST_ACK 的状态
  4. 第四次挥手:客户端接收到FIN报文后回一个ACK应答报文,之后客户端处于 TIME_WAIT 状态
  5. 服务器收到ACK报文后,进入 CLOSE 状态,服务器完成连接关闭。
  6. 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,客户端也完成连接的关闭。
为什么四次挥手

客户端发送FIN报文表示不发送数据,但还可以接收数据

关闭连接时,服务端可能还要数据处理和发送,就可以先回一个ACK,等到不再发送数据,再发送FIN表示他同意关闭连接

所以:服务端通常需要等待完成数据的发送和处理,ACK和FIN一般都会分开发

为什么需要TIME_WAIT状态

主动发起关闭连接的一方需要TIME_WAIT状态

原因:

  1. 防止历史连接中的数据,被后面相同的四元组的链接错误的接收。
    网络可能出现拥塞或者延迟,导致滞留的数据包被传递给新连接,导致数据干扰
  2. 保证最后的ACK能让被动关闭方接收,从而帮助正常关闭
TIME_WAIT的危害
  1. 内存资源占用
  2. 对端口资源的占用,
为什么是2MSL

MSL:Maximum Segment Lifetime 报文最大生存时间

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。

  1. 等待MSL两倍:发送方数据包被接收处理后又向对方发送响应,一来一回需要两倍
  2. 确保四次挥手主动关闭方最后的ACK能到达对端

重传机制

实现可靠传输的方式:序列号和确认应答

  1. 超时重传:计时器范围内没有收到对方的确认ACK,就会重发,每次重传时间都设为先前的两倍
  2. 快速重传:以数据驱动重传;当收到三个相同的ACK报文。会重传丢失的报文段。
    问题:重传多少报文段
  3. SACK 选择性确认:解决重传哪些报文;需要在TCP头部加SACK,将已收到的数据信息发送给发送方
  4. D-SACK:主要使用另外SACK告诉发送方哪些数据被重复接收
    使用D-SACK的好处:
    (1)可以让【发送方】知道,是发出去的包丢了,还是接收方回应的ACK包丢了;
    (2)可以知道是不是【发送方】的数据包被网络演示了;
    (3)可以知道网络中是不是把【发送方】的数据包给复制了。

滑动窗口

解决问题:TCP每发送一次数据都需要应答;数据往返时间越长,网络吞吐量越低

特点:即使在往返时间较长的情况下,也不会降低网络通信的效率

窗口大小:无需等待确认应答可以继续发送数据的最大值;由接收方窗口大小决定

实现:操作系统开辟的一个缓存空间,按期收到确认应答,则清楚缓存区

累计确认:ACK700表示700之前的所有数据都被接收,ACK600确认应答报文丢失

滑动窗口不是一成不变的,如果读取速度非常快的话,接收窗口会很快空缺,新的大小则是通过TCP报文的Windows字段告诉,这个传输过程存在时延

流量控制

基本原理:使用滑动窗口机制,通过调整窗口大小告诉发送方其当前处理数据的能力

拥塞控制

  • 慢启动(Slow Start):TCP 连接初始阶段,发送方的拥塞窗口(Congestion Window, cwnd)从一个较小的值开始,逐步增大,以免过早引发网络拥塞。每次接收到一个确认(ACK),cwnd 值就会增大,这个增长是指数级的。
  • 拥塞避免(Congestion Avoidance):当 cwnd 增加到一个阈值(ssthresh)时,慢启动结束,进入拥塞避免阶段。此时,cwnd 的增长从指数变为线性增长,逐步提高发送速率以检测网络是否接近拥塞。
  • 快速重传(Fast Retransmit):当发送方收到连续三个重复的 ACK 时,它假设有一个数据包丢失,于是立即重传丢失的数据包,而不必等待重传计时器超时。
  • 快速恢复(Fast Recovery):在快速重传之后,TCP 不像慢启动那样将 cwnd 重置为 1,而是将其减半,然后继续线性增长。这种机制可以更快地恢复传输速率。

IP

位于TCP/IP参考模型的第三层,网络层

网络层作用:实现主机与主机之间的通信,也就是点对点通信

网络层IP与数据链路层MAC的关系:MAC实现直连的两个设备间的通信;IP负责在没有直连的两个网络之间进行通信传输

在网络数据包传输过程中,IP地址并不会发生改变,但是源和目标MAC会一直变化

IP地址分类

A、B、C类地址

主机号全0指定某个网络

主机号为1,指定某个网络下的所有主机,用于广播

广播地址:用于在同一个链路相互连接的主机之间发送数据包,分为本地广播和直接广播

本地广播:在本网络内广播,广播地址的IP包会被路由器屏蔽

直接广播:在不同网络之间的广播

D、E类地址

特点:没有主机号,所以不可用于主机IP,

D类:常被用于多播;用于将包发送给特定组内的所有主机;因为广播无法穿透路由,若想给其他网段发送同样的包,则可以使用可以穿透路由的多播;前四位表示多播地址

E类:预留的分类,暂时未使用

分类的优缺点

优点:可以根据IP地址的前四位来判断IP地址属于哪个类别

缺点:同一网络下没有地址层次;A、B、C类不能很好的与现实网络匹配

缺点解决:CIDR无分类地址

CIDR无分类地址

定义:不再分类地址,32bit的IP地址被划分为两部分,前面是网络号,后面是主机号

子网掩码

另一种划分网络号和主机的形式,掩码就是掩盖掉主机号,剩余的就是网络号

将子网掩码和IP地址按位计算AND,就可得到网络号

为什么要分离网络号和主机号

答:因为两台计算机要通讯,首先要判断是否处于同一个广播域(网络地址),网络地址相同,则可以把数据包直接发送到目标主机

如何进行子网划分

子网掩码还有一个作用就是划分子网,将主机地址分为两块,子网网络地址和子网主机地址

路由控制

IP的网络地址用于进行路由控制,路由控制表中记录着网络地址与下一步应该发送至路由器的地址;主机和路由器上都有各自的路由器控制表

发送IP包时,如果存在多种相同网络地址的记录,选择相同位数最多的网络地址,也就是最长匹配

环回地址:127.0.0.1

IP分片与重组

每种数据链路的最大传输单位MTU是不相同的,当IP数据包大于MTU时,IP数据包就会被分片;

经过分片之后的IP数据被重组的时候,只能由目标主机进行,路由器是不会进行重组

在分片传输的过程中,一个分片丢失就会造成整个IP数据报作废,TCP引入MSS,在TCP层进行分片

IPV6

亮点

  1. 可分配地址变多
  2. 可自动配置,即使没有DHCP服务器也可以实现自动分配IP地址
  3. 包头包首部长度采用固定的值40字节,去掉包头校验和,简化了首部结构,减轻了路由器负荷
  4. 有应对伪造的IP地址的网络安全功能以及防止线路窃听的功能

地址

IPV6地址长度128位,每16位为一组

结构

通过IP地址的前几位标识IP地址的种类,只要分为以下3种类型:

单播地址:用于一对一的通信;

组播地址:用于一对多的通信;

任播地址:用于通信最近的节点,最近的节点是由路由协议决定;

与IPV4的区别

  1. 取消了首部校验和字段:在数据链路层和传输层都会校验
  2. 取消分片/重新组装相关字段:不允许在中间路由器进行分片与重组,大大提高了路由器转发的速度
  3. 取消选项字段:使IPV6首部成为固定长度的40字节

ARP与RARP协议

1. ARP协议

ARP(地址解析协议)用于通过已知的IP地址获取对应的MAC地址。主机会通过广播发送ARP请求,包含目标IP地址。同一链路上的设备接收到请求后,如果目标IP地址与自己的IP一致,则返回包含自己MAC地址的ARP响应包。操作系统通常会缓存获取的MAC地址,但缓存有一定期限。

2. RARP协议

RARP(逆地址解析协议)用于通过已知的MAC地址获取IP地址。常用于嵌入式设备接入网络时,通过RARP服务器获取IP地址。

3. DHCP动态获取IP地址

DHCP(动态主机配置协议)通过四个步骤自动获取IP地址:

  • DHCP发现(DHCP Discover): 客户端通过广播发送一个DHCP发现消息,向网络中的DHCP服务器请求IP地址。
  • DHCP提供(DHCP Offer): 网络中的DHCP服务器收到发现消息后,向客户端发送一个DHCP提供消息,其中包含一个可用的IP地址以及相关的配置信息(如子网掩码、网关地址、DNS服务器等)。
  • DHCP请求(DHCP Request): 客户端收到提供消息后,向DHCP服务器发送一个请求消息,表明愿意接受所提供的IP地址和配置信息。
  • DHCP确认(DHCP Acknowledgment): DHCP服务器收到请求消息后,向客户端发送确认消息,并正式分配IP地址给客户端,客户端即可使用该IP地址进行网络通信。
    DHCP交互中使用的都是UDP广播通信
DHCP中继代理

定义:对于不同网段的IP地址分配可以由一个DHCP服务器进行统一管理

DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。

NAT( Network Address Translation, 网络地址转换)

定义:同个公司、家庭、教室内的主机对外部通信时,把私有IP地址转换成公有IP地址

作用:缓解了IPV4地址耗尽的问题

普通的 NAT 转换没什么意义。 由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据 的。 因此,可以把IP 地址 + 端口号一起进行转换。 这样,就用一个全球 IP地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT。

缺点

NAT/NAPT依赖于自己的转换表,因此:

  • 外部无法主动与NAT内部服务器建立连接,因为NAPT转换表没有转换记录
  • 转换表的生成与转换操作都会产生性能开销
  • 通信过程中,如果NAT路由器重启,所有TCP连接都将被重置

优化方案

改用IPV6 :IPV6可用范围比较大
NAT穿透技术 :让网络应用程序主动发现自己位于NAT设备之后,并且主动获取NAT设备的公有IP,并为自己建立端口映射条目
ICMP互联网控制报文协议

ICMP

功能

确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。 在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。

ICMP的消息会使用IP进行发送

类别
  1. 查询报文类型:用于诊断的查询信息
  2. 差错报文类型:通知出错原因的错误类型

IGMP因特网组管理协议

组播地址说明只有一组的主机能收到数据包,不在一组的主机不能收到数据包,IGMP用于管理是否在一组

IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发组播包到对应的主机了。

IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常为 1,因为 IGMP 是工作在主机与连接的路由器之间。

工作机制
常规查询与响应
离开组播组
  1. 网播中仍有该组播组
  2. 网段中没有该组播组
相关推荐
小蜗牛慢慢爬行9 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
A小白590831 分钟前
Docker部署实践:构建可扩展的AI图像/视频分析平台 (脱敏版)
后端
goTsHgo38 分钟前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
waicsdn_haha1 小时前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
打鱼又晒网1 小时前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
Q_19284999061 小时前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
良许Linux1 小时前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
车轮滚滚__1 小时前
uniapp对接unipush 1.0 ios/android
笔记
求知若饥1 小时前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
左羊1 小时前
【代码备忘录】复杂SQL写法案例(一)
后端