TCP/IP协议栈

一、OSI七层参考模型

OSI七层模型是一个理论框架,它将复杂的网络通信过程分解成七个独立的、各司其职的层次。​​ 每一层都为它的上一层提供服务,并使用它下一层提供的服务。这样设计的好处是,只要层与层之间的接口不变,任何一层的技术变化都不会影响其他层,极大地促进了网络技术的标准化和发展。

物理层

物理层是OSI模型中的第一层,也是最底层。它为数据链路层提供传输比特流的服务,建立了、维持和断开物理连接。

传输介质:

双工模式:

半双工 --- 同一时刻,只能发送或接收。通信是​​单向​​的,就像单行道。一方固定为发送方,另一方固定为接收方。数据只能从一个方向流向另一个方向,永远不能反向。
全双工 --- 同时可以发送和接收。通信是​双向的​ ,但​不能同时进行​。就像一条单车道桥,车可以从两边过,但同一时间只能有一个方向的车流。通信双方都可以发送和接收,但必须轮流进行。

线序:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕

数据链路层

数据链路层是计算机网络OSI模型中的第二层,也是TCP/IP模型中的网络接口层的一部分。它在物理层提供的比特流服务基础上,在相邻节点(直接相连的两个设备)之间建立可靠的数据传输通道

1.核心---以太网

以太网是当今局域网 技术中绝对的主流和标准。我们日常生活中接触到的有线网络(比如通过网线上网)几乎都是以太网。

2.链路类型与MAC地址的由来

早期的以太网使用一根同轴电缆,所有电脑都接在这根总线上。这就好比在一个大房间里,所有人都在同一个频道上说话。当A电脑发出一段信息,房间里的所有电脑(B、C、D...)都能"听"到。那么问题来了,它们怎么知道这段话是跟自己说的,还是跟别人说的?为了解决这个问题,就给房间里的每个人(每个网络设备)分配一个全球唯一的、刻在"身份证"上的物理地址 ,这就是MAC地址。A电脑发送信息时,会在信息前面写上:"这段话是给MAC地址为XX:XX:XX:XX:XX:XX的",其他电脑"听"到后,会核对目标地址是不是自己,如果不是就忽略。

所以,正是因为以太网允许多个节点接入同一个"广播域",才需要MAC地址来进行精准的"点名"

3.MAC地址详解

  • MAC地址由48个二进制位组成。

  • 前24位 :称为 OUI 。由IEEE统一分配給特定的网络设备制造商。比如, Cisco、Intel、Apple都有自己的OUI范围。通过OUI,你就可以知道这个网卡是哪个公司生产的。

  • 后24位 :由制造商自行分配給他们生产的每一块网络设备(如网卡)。这保证了世界上每一块网卡的MAC地址都是唯一的。

  • 表示形式 :为了方便阅读,我们将48位二进制数分成6组,每组8位(即1个字节),然后每组转换成两个十六进制数,并用冒号:或连字符-分隔。

    • 例如:00-1A-2B-3C-4D-5E00:1A:2B:3C:4D:5E

4. 以太网数据帧格式

以太网存在两种数据帧格式:以太网2****格式,IEEE802.3格式

字段 长度 含义与作用
目的MAC地址 6字节 数据帧要发给谁。这是帧在局域网内转发的依据。
源MAC地址 6字节 数据帧是谁发出的。接收方需要知道是谁发来的,以便回复。
类型 2字节 一个至关重要的"标签" 。它告诉接收方,数据部分封装的是什么协议的数据。
数据 46-1500字节 载荷。这是从上层(通常是网络层)传下来的数据包,比如一个IP数据包。
FCS 4字节 帧检验序列 。用于差错检测。发送方会根据帧头和数据计算一个CRC值放在这里,接收方重新计算并比对。如果不同,就说明传输过程中比特出错了,该帧会被丢弃。
为什么数据长度是46-1500字节?
  • 最大1500字节 :这是以太网的最大传输单元 。如果上层的数据包太大,网络层就需要将其分片

  • 最小46字节:这是为了确保帧足够长,以满足早期CSMA/CD机制的要求。如果数据本身不足46字节,需要填充到46字节。

5.数据帧的发送方式

方式 目的MAC地址特征 比喻 应用场景
单播 一个特定的MAC地址 一对一私信 绝大多数正常通信,如你访问一个网站、传输一个文件。
广播 FF-FF-FF-FF-FF-FF 在群里@全体成员 ARP请求 ("谁的IP是192.168.1.1?请告诉我你的MAC地址");某些路由协议。广播帧会被局域网内所有主机接收和处理,因此不能滥用。
组播 01-00-5E开头的特定地址 建立一个讨论组,只在组内发言 视频会议、网络电视等流媒体应用。只有加入了特定组播组的主机才会接收和处理该帧,效率高于广播。

网络层

1.IP地址分类与结构

P地址的分类(A, B, C, D, E)

IP地址是一个32位的二进制数,为了便于阅读,我们将其分为4个8位组,用点分十进制表示(如 192.168.1.1)。分类由地址的前几个比特决定。

类别 地址范围 固定前缀 网络位/主机位 用途与解释
A类 0.0.0.0 - 127.255.255.255 0 网络位(8bit) / 主机位(24bit) 大型网络。只有126个A类网(0和127保留),但每个网络能容纳约1677万台主机。
B类 128.0.0.0 - 191.255.255.255 10 网络位(16bit) / 主机位(16bit) 中型网络。如大型企业、高校。每个网络能容纳约6.5万台主机。
C类 192.0.0.0 - 223.255.255.255 110 网络位(24bit) / 主机位(8bit) 小型网络。最常见,如家庭、小公司网络。每个网络只能容纳254台主机。
D类 224.0.0.0 - 239.255.255.255 1110 无网络/主机位之分 组播地址。用于"一组"设备,而非某一台。如视频会议。
E类 240.0.0.0 - 255.255.255.255 1111 - 保留地址。用于科学研究。

A、B、C三类地址被称为单播地址,掩码分别为816、24,这些地址是可以作为源地址使用的。

2.特殊IP地址与私网地址

特殊IP地址:

这些地址有特殊含义,不能分配给具体设备

地址 含义与用途
0.0.0.0 1. 默认路由 :在路由表中,代表"所有未知网络"。 2. 无效地址:代表一个无效或未知的地址。
127.0.0.1 (及整个127.x.x.x网段) 环回地址 。数据包不会发到网络上去,而是直接返回给本机的网络协议栈。用于测试本机的网络服务是否正常 (如 ping 127.0.0.1)。
主机位全0 (如 192.168.1.0/24) 网络地址网段地址 。它代表整个网络本身,而不是某台设备。
主机位全1 (如 192.168.1.255/24) 定向广播地址 。发送到这个地址的数据包,会被投递到指定网络中的所有主机。
255.255.255.255 受限广播地址 。这个数据包会被发送到本网络内的所有主机,路由器通常不会转发它。
可用IP数量公式:

可用IP数量:2 ^N(N =主机位位数)-2**;即减去全0和全1IP地址**。

  • N主机位的位数。

  • -2 是因为要减去网络地址 (主机位全0)和定向广播地址(主机位全1)。

  • 举例 :一个C类网段 192.168.1.0/24,主机位有8位,可用IP数量为 2^8 - 2 = 254 个(从 192.168.1.1192.168.1.254)。

注:任意一个网段中,全0和全1的地址不能作为IP地址使用。

私网IP地址与公网IP地址

为了解决IPv4地址枯竭问题,RFC标准定义了三块私网地址范围。

类别 私网地址段 解释
A类私网 10.0.0.0/8 一个巨大的私网,包含约1677万个地址。
B类私网 172.16.0.0/16 - 172.31.0.0/16 16个连续的B类网络。
C类私网 192.168.0.0/24 - 192.168.255.0/24 256个连续的C类网络。家庭路由器最常用

关键区别

  • 私网地址

    • 可重复使用 :你家、我家、公司都可以使用 192.168.1.0/24 这个网段。

    • 不能直接上网 :路由器不会将目的地址是私网IP的数据包转发到互联网上。

    • 需要通过 NAT 技术,将私网IP转换成一个公网IP,才能访问互联网。

  • 公网地址

    • 全球唯一:在整个互联网上,每个公网IP都标识着一台唯一的设备。

    • 需要向ISP(互联网服务提供商)申请购买。

3.IP报文头详解

字段名 长度 含义与作用
Version 4 bits 版本 。对于IPv4,此值为 4
IHL 4 bits 首部长度。因为IP首部长度不固定(有选项),此字段指明首部有多少个32位字(一行)。最小值是5(即20字节)。
Total Length 16 bits 总长度。指整个IP数据报(首部+数据)的总字节数。最大为65535字节。
TTL 8 bits 生存时间防环机制。数据包每经过一个路由器,TTL值减1。当TTL减到0时,路由器会丢弃该包,并向源IP发送一个ICMP超时消息。这可以防止数据包因路由环路而在网络中无限循环。
Protocol 8 bits 协议一个至关重要的"标签" ,类似于以太网帧中的"类型"字段。它告诉接收方的网络层,应该将数据部分交给哪个上层协议 处理。常见值:1(ICMP), 6(TCP), 17(UDP)。
Header Checksum 16 bits 首部校验和 。用于检查IP报文首部 在传输过程中是否出错。不校验数据部分,数据的可靠性由上层(如TCP)或应用保证。
Source/Dest IP 32 bits 源和目的IP地址 。这是IP报文的核心,指明了数据包的起点和终点。

4.IP分片与MTU

MTU最大传输单元 。指数据链路层 一帧所能承载的最大数据量 。在以太网中,默认是 1500字节

IP分片

  • 问题 :当网络层收到一个要发送的IP数据报(比如来自TCP的一个大包),其总长度超过了出口链路的MTU时,怎么办?

  • 解决方案IP分片 。路由器会将这个大的IP数据报分割成多个片段,每个片段都是一个独立的IP数据报(有自己的IP头,但总长度小于等于MTU),然后分别发送。

  • 重组:目的主机收到所有片段后,根据标识符、标志和片偏移,将它们重新组装成原始的数据报。

传输层

1.传输层与端口号

网络层(IP协议)负责将数据包从一台主机送到另一台主机,而传输层 负责将数据正确交付到主机上的特定应用程序

端口号用于标识上层应用层的服务类型。2字节大小。

类型 范围 说明 常见协议举例
静态端口 1 - 1023 分配给知名服务。通常需要系统权限才能监听。 HTTP: 80 , HTTPS: 443 , FTP: 21 , SSH: 22 , Telnet: 23 , DNS: 53
动态端口 1024 - 65535 由客户端程序随机使用,或分配给一些用户级服务。 当你打开浏览器访问网站时,浏览器会随机开启一个端口(如52001)去连接服务器的80端口。

一个完整的通信地址IP地址 + 端口号 ,构成了一个 Socket (套接字)。例如 192.168.1.100:52001 -> 220.181.38.148:80

2.TCP协议 - 传输控制协议

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

字段名 含义与作用
Sequence Number 序列号 。指出本报文段所发送数据的第一个字节 在整个数据流中的编号。用于排序
Acknowledgment Number 确认号 。期望收到对方下一个报文段 的第一个数据字节的序号。值为收到的序列号 + 数据长度 + 1。用于确认
Data Offset 数据偏移,即TCP首部长度。
Control Bits 控制位 ,共6个: • URG :紧急指针有效。 • ACK :确认号有效。一旦连接建立,ACK必须为1 。 • PSH :接收方应尽快将数据交付应用层。 • RST :重置连接,用于异常中断。 • SYN :同步序列号,用于建立连接 。 • FIN :发端完成发送任务,用于断开连接
Window 窗口大小 。用于流量控制,告诉对方"我还能接收多少字节的数据"。

3.TCP的可靠性机制

机制 原理与解释
确认机制 接收方收到数据后,必须回复一个ACK确认报文,告知发送方"数据已收到"。
重传机制 发送方发送数据后会启动一个定时器 。如果超时仍未收到ACK,就认为数据丢失,会重新发送该数据。
排序机制 利用序列号,接收方可以将乱序到达的数据包重新排序,组装成完整有序的数据流。
流量控制(滑动窗口) 接收方通过窗口字段 告知发送方自己的接收能力。发送方只能发送在窗口内的数据。这防止了发送过快导致接收方缓冲区溢出。窗口是动态变化的

4.TCP分段与MSS

  • MSS最大报文段长度 。指TCP报文段中数据部分的最大长度。

  • 公式MSS = MTU (1500) - IP头部(20) - TCP头部(20) = 1460字节

  • 为什么TCP要自己分段?

    • 笔记里解释得非常到位:如果让IP层去分片,那么任何一个IP分片丢失,整个原始IP数据报都会作废,TCP需要重传整个大数据块,效率低下。

    • TCP在发送前,就根据MSS将应用层数据分成合适大小的 。这样,如果某个段丢失,TCP只需重传那一个丢失的段,效率更高。

5.TCP连接管理:三次握手与四次挥手

三次握手 --- 建立连接


目标是同步双方的初始序列号,并交换参数。

  1. 客户端 -> 服务器[SYN=1, seq=x]

    • 客户端说:"你好,我想建立连接,我的初始序列号是x。"
  2. 服务器 -> 客户端[SYN=1, ACK=1, seq=y, ack=x+1]

    • 服务器说:"我同意连接,我的初始序列号是y。你发的x我收到了,下次请从x+1开始发。"
  3. 客户端 -> 服务器[ACK=1, seq=x+1, ack=y+1]

    • 客户端说:"好的,连接已建立。你发的y我收到了,下次请从y+1开始发。"

      此后,双方进入 ESTABLISHED 状态,开始数据传输。

四次挥手 --- 断开连接

TCP连接是全双工的,因此每个方向必须单独关闭。

  1. 主动方 -> 被动方[FIN=1, seq=u]

    • 主动方说:"我这边数据发完了,要关闭连接。"
  2. 被动方 -> 主动方[ACK=1, seq=v, ack=u+1]

    • 被动方说:"好的,我知道你要关了。"(此时,主动方到被动方的连接关闭)
  3. 被动方 -> 主动方[FIN=1, ACK=1, seq=w, ack=u+1]

    • 被动方等自己的数据也发完后,说:"我这边也发完了,我也要关了。"
  4. 主动方 -> 被动方[ACK=1, seq=u+1, ack=w+1]

    • 主动方说:"好的,再见。"(被动方收到后关闭连接)

    • 主动方进入 TIME-WAIT 状态,等待2MSL (两倍报文最大生存时间)后彻底关闭。这是为了确保被动方收到了最后的ACK,防止旧连接的数据包干扰新连接。

6.UDP协议 - 用户数据报协议

UDP是一种非面向连接的尽力而为的传输协议。(无连接的、不可靠的 传输层协议。)

特点与解释

  • 无连接:通信前不需要建立连接,直接发送。开销小,延迟低。

  • 不可靠:不保证数据能到达目的地,不保证顺序,没有确认和重传机制。

  • 尽力而为:它只是把数据发出去,不管结果。

  • 首部简单:只有8个字节,比TCP的20字节小得多。

7.TCP vs UDP 应用场景

特性 TCP UDP
连接性 面向连接 无连接
可靠性 可靠 不可靠
速度/开销 慢,开销大 快,开销小
数据顺序 保证 不保证
流量控制 有(滑动窗口)
应用场景 Web浏览(HTTP/HTTPS)文件传输(FTP)电子邮件(SMTP) 视频流媒体语音通话(VoIP)在线游戏DNS查询
相关推荐
报错小能手3 小时前
C++笔记(面向对象)对于对象返回方式的讲解
笔记
汪汪大队u3 小时前
CSMA/CA 协议和CSMA/CD的区别
网络
Olrookie4 小时前
StreamX部署详细步骤
大数据·笔记·flink
报错小能手4 小时前
项目——基于C/S架构的预约系统平台(3)
linux·开发语言·笔记·学习·架构·1024程序员节
星空的资源小屋4 小时前
Tuesday JS,一款可视化小说编辑器
运维·网络·人工智能·编辑器·电脑·excel
心寒丶4 小时前
Linux基础知识(三、Linux常见操作目录命令)
linux·运维·服务器·1024程序员节
ajassi20004 小时前
开源 Linux 服务器与中间件(十二)FRP内网穿透应用
linux·服务器·开源·frp
AAA阿giao4 小时前
JavaScript 中的变量声明:var、let 与 const 深度解析
javascript·笔记
W.Y.B.G4 小时前
css3 学习笔记
笔记·学习·css3·1024程序员节