欢迎光临
我们一直在努力

网络协议与通信原理深度解析

哈喽,编程搭子们!😜 又到了沉浸式敲代码的快乐时间~把生活调成「代码模式」,带着满满的热爱钻进编程的奇妙世界——今天也要敲出超酷的代码,冲鸭!🚀

在这里插入图片描述

✨ 我的博客主页:喜欢吃燃面 📚 我的专栏(持续更新ing): 《C语言》 | 《C语言之数据结构》 | 《C++》 | 《Linux学习笔记》 💖 超感谢你点开这篇博客!真心希望这些内容能帮到正在打怪升级的你~如果有任何想法、疑问,或者想交流学习心得,都欢迎留言/私信,咱们一起在编程路上互相陪伴、共同进步呀!

引言:为什么需要网络协议

在计算机科学领域,网络通信是现代信息技术的基石。当我们发送一条消息、浏览一个网页或传输一份文件时,数据究竟是如何从一台设备准确无误地到达另一台设备的?这背后涉及的操作系统机制、协议分层设计以及数据封装与解封装过程,构成了网络编程的核心知识体系。本文将基于网络协议的本质,深入剖析从底层硬件到上层应用的数据传输全过程,帮助读者建立完整的网络通信认知框架。   网络协议本质上是一种“约定”。在计算机世界中,任何两个实体要进行有效通信,都必须事先约定好通信规则。这种约定包括数据格式、传输顺序、错误处理机制等。正如人类交流需要共同的语言一样,计算机之间的通信也需要统一的“语言”——这就是协议。协议的存在解决了异构系统之间的互联互通问题,使得不同厂商、不同操作系统、不同硬件架构的设备能够无缝协作。

一、协议的分层思想

1.1 分层结构的必要性

网络通信面临的核心问题可以归纳为以下几点:网络通信面临的核心问题可以归纳为以下几点:   a. 数据如何在两个相隔甚远的设备之间传输?   物理距离是网络通信首先要克服的障碍。数据需要跨越局域网、城域网、广域网,甚至跨越海洋和大洲,才能到达目的地。这个过程中涉及信号衰减、噪声干扰、路由选择等一系列复杂问题。物理距离是网络通信首先要克服的障碍。数据需要跨越局域网、城域网、广域网,甚至跨越海洋和大洲,才能到达目的地。这个过程中涉及信号衰减、噪声干扰、路由选择等一系列复杂问题。   b. 目标主机定位和路径选择的问题   互联网上连接着数十亿台设备,如何准确找到目标主机?数据包在传输过程中需要经过无数路由器和交换机,如何选择最优路径?这些问题需要精巧的寻址和路由机制来解决。互联网上连接着数十亿台设备,如何准确找到目标主机?数据包在传输过程中需要经过无数路由器和交换机,如何选择最优路径?这些问题需要精巧的寻址和路由机制来解决。   c. 数据丢失和损坏的情况如何处理?   物理链路并非完美无缺,数据包可能在传输过程中丢失、损坏或乱序。如何检测这些错误?如何确保数据的完整性和有序性?这需要可靠的传输机制。物理链路并非完美无缺,数据包可能在传输过程中丢失、损坏或乱序。如何检测这些错误?如何确保数据的完整性和有序性?这需要可靠的传输机制。   d. 数据到达后的目的和处理方式   即使数据成功到达目标主机,操作系统还需要知道将数据交给哪个进程处理。一台主机上可能同时运行着浏览器、邮件客户端、视频播放器等多个网络应用,如何区分它们的数据?即使数据成功到达目标主机,操作系统还需要知道将数据交给哪个进程处理。一台主机上可能同时运行着浏览器、邮件客户端、视频播放器等多个网络应用,如何区分它们的数据?

1.2 TCP/IP协议栈的分层设计

为了解决上述问题,网络协议采用了分层设计的思想。TCP/IP 协议栈将网络通信划分为四个层次:

#mermaid-svg-6VrmjuIuSKtwgdt3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6VrmjuIuSKtwgdt3 .error-icon{fill:#552222;}#mermaid-svg-6VrmjuIuSKtwgdt3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6VrmjuIuSKtwgdt3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .marker.cross{stroke:#333333;}#mermaid-svg-6VrmjuIuSKtwgdt3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6VrmjuIuSKtwgdt3 p{margin:0;}#mermaid-svg-6VrmjuIuSKtwgdt3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster-label text{fill:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster-label span{color:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster-label span p{background-color:transparent;}#mermaid-svg-6VrmjuIuSKtwgdt3 .label text,#mermaid-svg-6VrmjuIuSKtwgdt3 span{fill:#333;color:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .node rect,#mermaid-svg-6VrmjuIuSKtwgdt3 .node circle,#mermaid-svg-6VrmjuIuSKtwgdt3 .node ellipse,#mermaid-svg-6VrmjuIuSKtwgdt3 .node polygon,#mermaid-svg-6VrmjuIuSKtwgdt3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .rough-node .label text,#mermaid-svg-6VrmjuIuSKtwgdt3 .node .label text,#mermaid-svg-6VrmjuIuSKtwgdt3 .image-shape .label,#mermaid-svg-6VrmjuIuSKtwgdt3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-6VrmjuIuSKtwgdt3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .rough-node .label,#mermaid-svg-6VrmjuIuSKtwgdt3 .node .label,#mermaid-svg-6VrmjuIuSKtwgdt3 .image-shape .label,#mermaid-svg-6VrmjuIuSKtwgdt3 .icon-shape .label{text-align:center;}#mermaid-svg-6VrmjuIuSKtwgdt3 .node.clickable{cursor:pointer;}#mermaid-svg-6VrmjuIuSKtwgdt3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .arrowheadPath{fill:#333333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6VrmjuIuSKtwgdt3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6VrmjuIuSKtwgdt3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6VrmjuIuSKtwgdt3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster text{fill:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 .cluster span{color:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6VrmjuIuSKtwgdt3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6VrmjuIuSKtwgdt3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-6VrmjuIuSKtwgdt3 .icon-shape,#mermaid-svg-6VrmjuIuSKtwgdt3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6VrmjuIuSKtwgdt3 .icon-shape p,#mermaid-svg-6VrmjuIuSKtwgdt3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6VrmjuIuSKtwgdt3 .icon-shape .label rect,#mermaid-svg-6VrmjuIuSKtwgdt3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6VrmjuIuSKtwgdt3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6VrmjuIuSKtwgdt3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6VrmjuIuSKtwgdt3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

TCP/IP 协议栈

应用层HTTP, FTP, SMTP, DNS

传输层TCP, UDP

网络层IP, ICMP, ARP

数据链路层以太网, WiFi, PPP

物理层光纤, 双绞线, 无线电波

应用层负责为应用程序提供网络服务接口,常见的协议包括 HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)等。应用层协议直接面向用户需求,定义了数据的语义和交互逻辑。应用层负责为应用程序提供网络服务接口,常见的协议包括 HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)等。应用层协议直接面向用户需求,定义了数据的语义和交互逻辑。   传输层负责端到端的可靠数据传输。TCP(传输控制协议)提供面向连接的、可靠的字节流服务,通过三次握手建立连接、四次挥手断开连接,并通过确认应答、超时重传、流量控制、拥塞控制等机制保证数据可靠性。**UDP(用户数据报协议)**则提供无连接的、尽最大努力交付的数据报服务,适用于实时性要求高但可容忍少量丢包的场景。传输层负责端到端的可靠数据传输。TCP(传输控制协议)提供面向连接的、可靠的字节流服务,通过三次握手建立连接、四次挥手断开连接,并通过确认应答、超时重传、流量控制、拥塞控制等机制保证数据可靠性。UDP(用户数据报协议)则提供无连接的、尽最大努力交付的数据报服务,适用于实时性要求高但可容忍少量丢包的场景。   网络层负责数据包从源主机到目的主机的路由选择和转发。**IP(网际协议)**是网络层的核心,它定义了 IP 地址格式、数据包格式以及路由算法。ICMP(互联网控制消息协议)用于传递控制消息和错误报告。ARP(地址解析协议)用于将 IP 地址解析为 MAC 地址。网络层负责数据包从源主机到目的主机的路由选择和转发。IP(网际协议)是网络层的核心,它定义了 IP 地址格式、数据包格式以及路由算法。ICMP(互联网控制消息协议)用于传递控制消息和错误报告。ARP(地址解析协议)用于将 IP 地址解析为 MAC 地址。   数据链路层负责相邻节点之间的数据传输。以太网是最常见的数据链路层技术,它定义了帧格式、MAC 地址以及 CSMA/CD(载波侦听多路访问/冲突检测)机制。WiFi(无线局域网)也是数据链路层的重要技术。数据链路层负责相邻节点之间的数据传输。以太网是最常见的数据链路层技术,它定义了帧格式、MAC 地址以及 CSMA/CD(载波侦听多路访问/冲突检测)机制。WiFi(无线局域网)也是数据链路层的重要技术。

1.3 分层设计的优势

分层设计带来了诸多好处:   独立性:每一层只需要关注自己的职责,不需要了解其他层的实现细节。层与层之间通过定义良好的接口交互。   灵活性:某一层的技术升级或替换不会影响其他层。例如,物理层可以从双绞线升级为光纤,而应用层完全无感知。   标准化:分层使得不同厂商可以独立开发各层产品,只要遵循相同的接口规范,就能实现互联互通。

二、网络传输的基本流程

2.1 局域网通信

局域网(LAN)是覆盖范围较小的网络,通常局限于一个建筑物或校园内。在局域网中,每台主机都需要有唯一的标识来确保数据能够准确送达。局域网(LAN)是覆盖范围较小的网络,通常局限于一个建筑物或校园内。在局域网中,每台主机都需要有唯一的标识来确保数据能够准确送达。   MAC 地址是数据链路层的物理地址,由 48 位二进制数组成,通常表示为 6 组十六进制数(如 00:16:3e:10:cc:36)。MAC 地址在网卡出厂时固化,全球唯一。通过 ifconfig 或 ip addr 命令可以查看本机的 MAC 地址和网络配置信息。   局域网通信的核心问题是:主机 A 如何找到主机 B?   在以太网中,数据以帧的形式传输。每个以太网帧包含源 MAC 地址和目的 MAC 地址。当主机 A 要向主机 B 发送数据时,它会将数据封装成帧,并在帧头中填入主机 B 的 MAC 地址。然后,这个帧被发送到共享的物理介质上,局域网中的所有主机都能收到这个帧,但只有 MAC 地址匹配的主机 B 会接收并处理它,其他主机则丢弃该帧。   这种工作方式引出了冲突检测问题。当多台主机同时发送数据时,信号会在物理介质上发生冲突,导致数据损坏。以太网采用 CSMA/CD(载波侦听多路访问/冲突检测) 机制来解决这个问题: 发送前先监听信道是否空闲; 如果空闲则发送数据; 发送过程中持续检测是否发生冲突; 如果检测到冲突,立即停止发送,发送干扰信号,等待随机时间后重试。

主机C

主机B

共享总线

主机A

主机C

主机B

共享总线

主机A

#mermaid-svg-IDjWoFikkPWSBUOa{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IDjWoFikkPWSBUOa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IDjWoFikkPWSBUOa .error-icon{fill:#552222;}#mermaid-svg-IDjWoFikkPWSBUOa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IDjWoFikkPWSBUOa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IDjWoFikkPWSBUOa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IDjWoFikkPWSBUOa .marker.cross{stroke:#333333;}#mermaid-svg-IDjWoFikkPWSBUOa svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IDjWoFikkPWSBUOa p{margin:0;}#mermaid-svg-IDjWoFikkPWSBUOa .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IDjWoFikkPWSBUOa text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-IDjWoFikkPWSBUOa .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IDjWoFikkPWSBUOa .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-IDjWoFikkPWSBUOa .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-IDjWoFikkPWSBUOa .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-IDjWoFikkPWSBUOa #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-IDjWoFikkPWSBUOa .sequenceNumber{fill:white;}#mermaid-svg-IDjWoFikkPWSBUOa #sequencenumber{fill:#333;}#mermaid-svg-IDjWoFikkPWSBUOa #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-IDjWoFikkPWSBUOa .messageText{fill:#333;stroke:none;}#mermaid-svg-IDjWoFikkPWSBUOa .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IDjWoFikkPWSBUOa .labelText,#mermaid-svg-IDjWoFikkPWSBUOa .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-IDjWoFikkPWSBUOa .loopText,#mermaid-svg-IDjWoFikkPWSBUOa .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-IDjWoFikkPWSBUOa .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IDjWoFikkPWSBUOa .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IDjWoFikkPWSBUOa .noteText,#mermaid-svg-IDjWoFikkPWSBUOa .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-IDjWoFikkPWSBUOa .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IDjWoFikkPWSBUOa .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IDjWoFikkPWSBUOa .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IDjWoFikkPWSBUOa .actorPopupMenu{position:absolute;}#mermaid-svg-IDjWoFikkPWSBUOa .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-IDjWoFikkPWSBUOa .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IDjWoFikkPWSBUOa .actor-man circle,#mermaid-svg-IDjWoFikkPWSBUOa line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-IDjWoFikkPWSBUOa :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

发送数据帧(目的MAC=B)

转发数据帧

转发数据帧

检查MAC地址匹配,接收数据

检查MAC地址不匹配,丢弃数据

2.2 跨网络通信

当通信双方不在同一个局域网时,就需要跨网络传输。当通信双方不在同一个局域网时,就需要跨网络传输。这时,仅靠MAC地址已经不够了,因为MAC地址只在局域网内有效,无法用于广域网路由。   IP地址应运而生。IP地址应运而生。IP地址是网络层的逻辑地址,用于在互联网中唯一标识一台主机。IPv4 地址由32位二进制数组成,通常表示为4个十进制数(如192.168.1.1)。IP地址分为网络号和主机号两部分,通过子网掩码来划分。   跨网络通信的核心机制是路由。跨网络通信的核心机制是路由。当数据需要从一个网络传输到另一个网络时,需要经过路由器的转发。路由器是连接不同网络的设备,它维护着路由表,根据目的IP地址决定数据包的下一跳。

#mermaid-svg-jz7suyaKOlS56IqQ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jz7suyaKOlS56IqQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jz7suyaKOlS56IqQ .error-icon{fill:#552222;}#mermaid-svg-jz7suyaKOlS56IqQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jz7suyaKOlS56IqQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jz7suyaKOlS56IqQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jz7suyaKOlS56IqQ .marker.cross{stroke:#333333;}#mermaid-svg-jz7suyaKOlS56IqQ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jz7suyaKOlS56IqQ p{margin:0;}#mermaid-svg-jz7suyaKOlS56IqQ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jz7suyaKOlS56IqQ .cluster-label text{fill:#333;}#mermaid-svg-jz7suyaKOlS56IqQ .cluster-label span{color:#333;}#mermaid-svg-jz7suyaKOlS56IqQ .cluster-label span p{background-color:transparent;}#mermaid-svg-jz7suyaKOlS56IqQ .label text,#mermaid-svg-jz7suyaKOlS56IqQ span{fill:#333;color:#333;}#mermaid-svg-jz7suyaKOlS56IqQ .node rect,#mermaid-svg-jz7suyaKOlS56IqQ .node circle,#mermaid-svg-jz7suyaKOlS56IqQ .node ellipse,#mermaid-svg-jz7suyaKOlS56IqQ .node polygon,#mermaid-svg-jz7suyaKOlS56IqQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jz7suyaKOlS56IqQ .rough-node .label text,#mermaid-svg-jz7suyaKOlS56IqQ .node .label text,#mermaid-svg-jz7suyaKOlS56IqQ .image-shape .label,#mermaid-svg-jz7suyaKOlS56IqQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-jz7suyaKOlS56IqQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jz7suyaKOlS56IqQ .rough-node .label,#mermaid-svg-jz7suyaKOlS56IqQ .node .label,#mermaid-svg-jz7suyaKOlS56IqQ .image-shape .label,#mermaid-svg-jz7suyaKOlS56IqQ .icon-shape .label{text-align:center;}#mermaid-svg-jz7suyaKOlS56IqQ .node.clickable{cursor:pointer;}#mermaid-svg-jz7suyaKOlS56IqQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jz7suyaKOlS56IqQ .arrowheadPath{fill:#333333;}#mermaid-svg-jz7suyaKOlS56IqQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jz7suyaKOlS56IqQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jz7suyaKOlS56IqQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jz7suyaKOlS56IqQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jz7suyaKOlS56IqQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jz7suyaKOlS56IqQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jz7suyaKOlS56IqQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jz7suyaKOlS56IqQ .cluster text{fill:#333;}#mermaid-svg-jz7suyaKOlS56IqQ .cluster span{color:#333;}#mermaid-svg-jz7suyaKOlS56IqQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jz7suyaKOlS56IqQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jz7suyaKOlS56IqQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-jz7suyaKOlS56IqQ .icon-shape,#mermaid-svg-jz7suyaKOlS56IqQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jz7suyaKOlS56IqQ .icon-shape p,#mermaid-svg-jz7suyaKOlS56IqQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jz7suyaKOlS56IqQ .icon-shape .label rect,#mermaid-svg-jz7suyaKOlS56IqQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jz7suyaKOlS56IqQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jz7suyaKOlS56IqQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jz7suyaKOlS56IqQ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

局域网B

互联网

局域网A

数据包

数据包

主机A192.168.1.10

路由器1

路由器2

路由器3

主机B10.0.0.20

2.3 封装与解封装

数据在传输过程中会经历封装和解封装的过程。数据在传输过程中会经历封装和解封装的过程。发送方从应用层开始,逐层向下添加头部信息;接收方则从物理层开始,逐层向上剥离头部信息,最终提取出原始数据。

#mermaid-svg-Eu5dsLIDw4Ru58Zj{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .error-icon{fill:#552222;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .marker.cross{stroke:#333333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj p{margin:0;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster-label text{fill:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster-label span{color:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster-label span p{background-color:transparent;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .label text,#mermaid-svg-Eu5dsLIDw4Ru58Zj span{fill:#333;color:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .node rect,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node circle,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node ellipse,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node polygon,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .rough-node .label text,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node .label text,#mermaid-svg-Eu5dsLIDw4Ru58Zj .image-shape .label,#mermaid-svg-Eu5dsLIDw4Ru58Zj .icon-shape .label{text-anchor:middle;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .rough-node .label,#mermaid-svg-Eu5dsLIDw4Ru58Zj .node .label,#mermaid-svg-Eu5dsLIDw4Ru58Zj .image-shape .label,#mermaid-svg-Eu5dsLIDw4Ru58Zj .icon-shape .label{text-align:center;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .node.clickable{cursor:pointer;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .arrowheadPath{fill:#333333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Eu5dsLIDw4Ru58Zj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Eu5dsLIDw4Ru58Zj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster text{fill:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .cluster span{color:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Eu5dsLIDw4Ru58Zj rect.text{fill:none;stroke-width:0;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .icon-shape,#mermaid-svg-Eu5dsLIDw4Ru58Zj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .icon-shape p,#mermaid-svg-Eu5dsLIDw4Ru58Zj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .icon-shape .label rect,#mermaid-svg-Eu5dsLIDw4Ru58Zj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Eu5dsLIDw4Ru58Zj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Eu5dsLIDw4Ru58Zj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Eu5dsLIDw4Ru58Zj :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

接收方_解封装过程

发送方_封装过程

传输介质

应用层数据

添加TCP/UDP头部

传输层数据段

添加IP头部

网络层数据包

添加MAC头部

数据链路层帧

物理层比特流

物理层比特流

剥离MAC头部

数据链路层帧

剥离IP头部

网络层数据包

剥离TCP/UDP头部

传输层数据段

应用层数据

每一层的头部都包含该层协议所需的关键信息:每一层的头部都包含该层协议所需的关键信息: TCP/UDP 头部:包含源端口号、目的端口号、序列号、确认号、窗口大小等 IP 头部:包含源 IP 地址、目的 IP 地址、TTL(生存时间)、协议类型等 MAC 头部:包含源 MAC 地址、目的 MAC 地址、类型字段等   这种封装机制使得每一层都能独立处理自己的协议信息,而不需要关心其他层的内容。同时,头部信息就像快递单上的地址标签,确保数据能够准确到达目的地。这种封装机制使得每一层都能独立处理自己的协议信息,而不需要关心其他层的内容。同时,头部信息就像快递单上的地址标签,确保数据能够准确到达目的地。

三、IP 地址与端口号

3.1 IP地址的作用

IP 地址是网络层的核心概念,它解决了“数据从哪里来,到哪里去”的问题。IP 地址的主要作用包括:   标识网络中的唯一主机:在全球互联网中,每个公网 IP 地址都是唯一的(不考虑 NAT 的情况),它就像每台主机的“门牌号”。   路由选择的依据:路由器根据目的 IP 地址查询路由表,决定数据包的转发路径。IP 地址的网络号部分用于确定目标网络,主机号部分用于确定网络内的具体主机。   网络分层的基础:IP 地址支持子网划分,使得大型网络可以被划分为多个小型子网,提高网络管理效率。

3.2 端口号的引入

当数据包到达目标主机后,操作系统面临一个新的问题:应该将数据交给哪个进程处理?一台主机上可能同时运行着多个网络应用程序,如 Web 浏览器(使用 HTTP 协议)、邮件客户端(使用 SMTP/POP3 协议)、FTP 客户端等。它们都通过网络收发数据,操作系统如何区分这些数据属于哪个应用?   端口号就是解决这个问题的关键。端口号是一个16位的整数,范围从0到65535。它用于标识主机上的特定网络进程。不同的网络服务使用不同的知名端口号: 在这里插入图片描述

知名端口(0-1023):由 IANA 统一分配,用于常见的网络服务,需要管理员权限才能绑定。 注册端口(1024-49151):用于用户注册的应用程序服务,普通用户可以使用。 动态/私有端口(49152-65535):临时分配给客户端程序使用,通信结束后释放。   3.3 四元组:唯一标识一个通信连接   在互联网中,一个完整的网络通信由四元组唯一标识:

{源IP地址, 源端口号, 目的IP地址, 目的端口号}

例如,当主机 A(IP: 192.168.1.10)上的浏览器(端口: 8888)访问主机 B(IP: 167.182.3.45)上的 Web 服务器(端口: 9999)时,这个通信连接可以表示为:

{192.168.1.10, 8888, 167.182.3.45, 9999}

四元组确保了即使在同一台主机上,不同的应用程序也能独立地进行网络通信而不会相互干扰。操作系统内核维护着一张套接字表,根据四元组将接收到的数据分发给对应的进程。

#mermaid-svg-OEYJQD6PwQZ3evNA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OEYJQD6PwQZ3evNA .error-icon{fill:#552222;}#mermaid-svg-OEYJQD6PwQZ3evNA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OEYJQD6PwQZ3evNA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OEYJQD6PwQZ3evNA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OEYJQD6PwQZ3evNA .marker.cross{stroke:#333333;}#mermaid-svg-OEYJQD6PwQZ3evNA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OEYJQD6PwQZ3evNA p{margin:0;}#mermaid-svg-OEYJQD6PwQZ3evNA .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster-label text{fill:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster-label span{color:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster-label span p{background-color:transparent;}#mermaid-svg-OEYJQD6PwQZ3evNA .label text,#mermaid-svg-OEYJQD6PwQZ3evNA span{fill:#333;color:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA .node rect,#mermaid-svg-OEYJQD6PwQZ3evNA .node circle,#mermaid-svg-OEYJQD6PwQZ3evNA .node ellipse,#mermaid-svg-OEYJQD6PwQZ3evNA .node polygon,#mermaid-svg-OEYJQD6PwQZ3evNA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OEYJQD6PwQZ3evNA .rough-node .label text,#mermaid-svg-OEYJQD6PwQZ3evNA .node .label text,#mermaid-svg-OEYJQD6PwQZ3evNA .image-shape .label,#mermaid-svg-OEYJQD6PwQZ3evNA .icon-shape .label{text-anchor:middle;}#mermaid-svg-OEYJQD6PwQZ3evNA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OEYJQD6PwQZ3evNA .rough-node .label,#mermaid-svg-OEYJQD6PwQZ3evNA .node .label,#mermaid-svg-OEYJQD6PwQZ3evNA .image-shape .label,#mermaid-svg-OEYJQD6PwQZ3evNA .icon-shape .label{text-align:center;}#mermaid-svg-OEYJQD6PwQZ3evNA .node.clickable{cursor:pointer;}#mermaid-svg-OEYJQD6PwQZ3evNA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OEYJQD6PwQZ3evNA .arrowheadPath{fill:#333333;}#mermaid-svg-OEYJQD6PwQZ3evNA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OEYJQD6PwQZ3evNA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OEYJQD6PwQZ3evNA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OEYJQD6PwQZ3evNA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OEYJQD6PwQZ3evNA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OEYJQD6PwQZ3evNA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster text{fill:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA .cluster span{color:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OEYJQD6PwQZ3evNA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OEYJQD6PwQZ3evNA rect.text{fill:none;stroke-width:0;}#mermaid-svg-OEYJQD6PwQZ3evNA .icon-shape,#mermaid-svg-OEYJQD6PwQZ3evNA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OEYJQD6PwQZ3evNA .icon-shape p,#mermaid-svg-OEYJQD6PwQZ3evNA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OEYJQD6PwQZ3evNA .icon-shape .label rect,#mermaid-svg-OEYJQD6PwQZ3evNA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OEYJQD6PwQZ3evNA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OEYJQD6PwQZ3evNA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OEYJQD6PwQZ3evNA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

主机B

网络

主机A

{192.168.1.10,8888,167.182.3.45,9999}

{192.168.1.10,4321,某IP,某端口}

{192.168.1.10,10086,某IP,某端口}

浏览器进程端口: 8888

QQ进程端口: 4321

邮件客户端端口: 10086

互联网

Web服务器端口: 9999

四、Socket:网络通信的编程接口

4.1 Socket的本质

**Socket(套接字)**是操作系统提供的网络编程接口,它封装了TCP/IP 协议的复杂性,为应用程序提供了简洁的网络通信能力。从操作系统内核的角度看,Socket本质上是一个struct file 结构体——在Linux系统中,一切皆文件,网络连接也不例外。   Socket具有以下核心属性:   协议族:指定使用的协议类型,如AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNIX(本地通信)等。   套接字类型:指定通信语义,如SOCK_STREAM(面向连接的流式套接字,对应 TCP)、SOCK_DGRAM(无连接的数据报套接字,对应 UDP)。   协议:指定具体的传输协议,如IPPROTO_TCP、IPPROTO_UDP 等。   本地地址和端口:绑定到套接字的本地IP地址和端口号。   远程地址和端口(对于已连接的套接字):通信对端的IP地址和端口号。   发送缓冲区和接收缓冲区:用于暂存待发送和已接收的数据。 状态信息:描述套接字当前的状态,如监听、已连接、关闭等。

4.2 Socket的工作流程

TCP Socket 的通信流程如下:   服务器端: 创建Socket(socket()) 绑定地址和端口(bind()) 监听连接请求(listen()) 接受客户端连接(accept()) 收发数据(send()/recv()) 关闭连接(close())   客户端: 创建Socket(socket()) 连接服务器(connect()) 收发数据(send()/recv()) 关闭连接(close())

服务器

客户端

服务器

客户端

#mermaid-svg-yUCzrIBGhCOBIPz5{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yUCzrIBGhCOBIPz5 .error-icon{fill:#552222;}#mermaid-svg-yUCzrIBGhCOBIPz5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yUCzrIBGhCOBIPz5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yUCzrIBGhCOBIPz5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yUCzrIBGhCOBIPz5 .marker.cross{stroke:#333333;}#mermaid-svg-yUCzrIBGhCOBIPz5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yUCzrIBGhCOBIPz5 p{margin:0;}#mermaid-svg-yUCzrIBGhCOBIPz5 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yUCzrIBGhCOBIPz5 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yUCzrIBGhCOBIPz5 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-yUCzrIBGhCOBIPz5 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-yUCzrIBGhCOBIPz5 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-yUCzrIBGhCOBIPz5 .sequenceNumber{fill:white;}#mermaid-svg-yUCzrIBGhCOBIPz5 #sequencenumber{fill:#333;}#mermaid-svg-yUCzrIBGhCOBIPz5 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-yUCzrIBGhCOBIPz5 .messageText{fill:#333;stroke:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yUCzrIBGhCOBIPz5 .labelText,#mermaid-svg-yUCzrIBGhCOBIPz5 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .loopText,#mermaid-svg-yUCzrIBGhCOBIPz5 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yUCzrIBGhCOBIPz5 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-yUCzrIBGhCOBIPz5 .noteText,#mermaid-svg-yUCzrIBGhCOBIPz5 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-yUCzrIBGhCOBIPz5 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yUCzrIBGhCOBIPz5 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yUCzrIBGhCOBIPz5 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yUCzrIBGhCOBIPz5 .actorPopupMenu{position:absolute;}#mermaid-svg-yUCzrIBGhCOBIPz5 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-yUCzrIBGhCOBIPz5 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yUCzrIBGhCOBIPz5 .actor-man circle,#mermaid-svg-yUCzrIBGhCOBIPz5 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-yUCzrIBGhCOBIPz5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

socket()

bind()

listen()

三次握手完成

连接建立

四次挥手完成

连接关闭

SYN(同步请求)

SYN-ACK(同步确认)

ACK(确认)

accept() 返回新套接字

发送数据

发送数据

FIN(结束请求)

ACK(确认)

FIN(结束请求)

ACK(确认)

4.3 操作系统如何将数据交给正确的进程

当网卡接收到数据包时,操作系统需要完成以下步骤将数据交付给正确的进程:   第一步:网卡接收数据   网卡检测到物理信号,将电信号转换为数字数据,存储在网卡自身的缓冲区中。然后,网卡通过DMA(直接内存访问)将数据复制到内核预先分配的内存区域,并向CPU发送中断信号。   第二步:中断处理   CPU响应网卡中断,执行网卡驱动程序的中断处理函数。中断处理函数完成必要的硬件操作后,将数据包交给内核网络子系统处理,通常是将数据包放入一个队列中,触发软中断进行后续处理。   第三步:协议栈处理   软中断处理程序从队列中取出数据包,逐层进行协议处理:   数据链路层:解析以太网帧头,检查目的MAC地址,提取类型字段。   网络层:解析IP头部,检查目的IP地址,进行路由判断,提取协议类型(TCP/UDP/ICMP 等)。   传输层:解析TCP/UDP头部,提取源端口号和目的端口号。   第四步:套接字匹配   内核根据提取到的四元组信息(源 IP、源端口、目的 IP、目的端口),在套接字哈希表中查找匹配的套接字。如果找到匹配的套接字,就将数据包放入该套接字的接收缓冲区中。   第五步:唤醒进程   如果对应的应用进程正在等待数据(如阻塞在recv()调用上),内核会唤醒该进程,使其从系统调用返回,读取接收缓冲区中的数据。如果进程没有等待,数据就暂存在缓冲区中,等待进程下次读取。

#mermaid-svg-lBQREHSRoHJxbRyC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lBQREHSRoHJxbRyC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lBQREHSRoHJxbRyC .error-icon{fill:#552222;}#mermaid-svg-lBQREHSRoHJxbRyC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lBQREHSRoHJxbRyC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lBQREHSRoHJxbRyC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lBQREHSRoHJxbRyC .marker.cross{stroke:#333333;}#mermaid-svg-lBQREHSRoHJxbRyC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lBQREHSRoHJxbRyC p{margin:0;}#mermaid-svg-lBQREHSRoHJxbRyC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lBQREHSRoHJxbRyC .cluster-label text{fill:#333;}#mermaid-svg-lBQREHSRoHJxbRyC .cluster-label span{color:#333;}#mermaid-svg-lBQREHSRoHJxbRyC .cluster-label span p{background-color:transparent;}#mermaid-svg-lBQREHSRoHJxbRyC .label text,#mermaid-svg-lBQREHSRoHJxbRyC span{fill:#333;color:#333;}#mermaid-svg-lBQREHSRoHJxbRyC .node rect,#mermaid-svg-lBQREHSRoHJxbRyC .node circle,#mermaid-svg-lBQREHSRoHJxbRyC .node ellipse,#mermaid-svg-lBQREHSRoHJxbRyC .node polygon,#mermaid-svg-lBQREHSRoHJxbRyC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lBQREHSRoHJxbRyC .rough-node .label text,#mermaid-svg-lBQREHSRoHJxbRyC .node .label text,#mermaid-svg-lBQREHSRoHJxbRyC .image-shape .label,#mermaid-svg-lBQREHSRoHJxbRyC .icon-shape .label{text-anchor:middle;}#mermaid-svg-lBQREHSRoHJxbRyC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lBQREHSRoHJxbRyC .rough-node .label,#mermaid-svg-lBQREHSRoHJxbRyC .node .label,#mermaid-svg-lBQREHSRoHJxbRyC .image-shape .label,#mermaid-svg-lBQREHSRoHJxbRyC .icon-shape .label{text-align:center;}#mermaid-svg-lBQREHSRoHJxbRyC .node.clickable{cursor:pointer;}#mermaid-svg-lBQREHSRoHJxbRyC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lBQREHSRoHJxbRyC .arrowheadPath{fill:#333333;}#mermaid-svg-lBQREHSRoHJxbRyC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lBQREHSRoHJxbRyC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lBQREHSRoHJxbRyC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lBQREHSRoHJxbRyC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lBQREHSRoHJxbRyC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lBQREHSRoHJxbRyC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lBQREHSRoHJxbRyC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lBQREHSRoHJxbRyC .cluster text{fill:#333;}#mermaid-svg-lBQREHSRoHJxbRyC .cluster span{color:#333;}#mermaid-svg-lBQREHSRoHJxbRyC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lBQREHSRoHJxbRyC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lBQREHSRoHJxbRyC rect.text{fill:none;stroke-width:0;}#mermaid-svg-lBQREHSRoHJxbRyC .icon-shape,#mermaid-svg-lBQREHSRoHJxbRyC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lBQREHSRoHJxbRyC .icon-shape p,#mermaid-svg-lBQREHSRoHJxbRyC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lBQREHSRoHJxbRyC .icon-shape .label rect,#mermaid-svg-lBQREHSRoHJxbRyC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lBQREHSRoHJxbRyC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lBQREHSRoHJxbRyC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lBQREHSRoHJxbRyC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

网卡接收数据

DMA复制到内核内存

触发硬件中断

中断处理程序

数据包入队列

软中断处理

解析以太网帧

解析IP数据包

解析TCP/UDP段

提取四元组

查找套接字哈希表

匹配套接字

数据存入接收缓冲区

唤醒等待进程

进程读取数据

五、协议的本质:结构体

5.1 协议即约定

从编程的角度看,网络协议的本质就是结构体(struct)。每一层协议的头部都可以看作是一个C语言结构体,其中定义了该层协议所需的各种字段。从编程的角度看,网络协议的本质就是结构体(struct)。每一层协议的头部都可以看作是一个C语言结构体,其中定义了该层协议所需的各种字段。   例如,以太网帧头可以定义为:例如,以太网帧头可以定义为:

struct eth_header {
unsigned char dst_mac[6]; // 目的MAC地址
unsigned char src_mac[6]; // 源MAC地址
unsigned short type; // 上层协议类型
};

IP 头部可以定义为:IP 头部可以定义为:

struct ip_header {
unsigned char version_ihl; // 版本和头部长度
unsigned char tos; // 服务类型
unsigned short total_len; // 总长度
unsigned short id; // 标识
unsigned short flags_offset; // 标志和片偏移
unsigned char ttl; // 生存时间
unsigned char protocol; // 上层协议
unsigned short checksum; // 头部校验和
unsigned int src_ip; // 源IP地址
unsigned int dst_ip; // 目的IP地址
};

TCP 头部可以定义为:TCP 头部可以定义为:

struct tcp_header {
unsigned short src_port; // 源端口号
unsigned short dst_port; // 目的端口号
unsigned int seq_num; // 序列号
unsigned int ack_num; // 确认号
unsigned char data_offset; // 数据偏移
unsigned char flags; // 标志位
unsigned short window; // 窗口大小
unsigned short checksum; // 校验和
unsigned short urgent_ptr; // 紧急指针
};

5.2 协议的可扩展性

协议的设计需要考虑可扩展性。以IP协议为例,IPv4 的 32 位地址空间已经逐渐耗尽,因此推出了 IPv6,将地址长度扩展到 128 位。这种扩展性是通过协议头部的版本字段来实现的——IPv4 数据包和 IPv6 数据包可以通过版本字段(IPv4 为 4,IPv6 为 6)来区分。     同样,TCP 协议也通过选项字段支持各种扩展功能,如窗口扩大因子、时间戳、选择性确认(SACK)等,这些都是在不改变基本头部格式的情况下实现的。

六、理解IP 地址和目的 IP 地址

6.1 源IP与目的IP

在网络通信中,IP地址分为源IP地址和目的IP地址:在网络通信中,IP地址分为源IP地址和目的IP地址:   源IP地址:标识数据包的发送方。在TCP/IP 协议栈中,源IP地址通常由操作系统自动填写,取自发送网络接口的IP地址。但在某些场景下(如NAT、代理、负载均衡),源IP地址可能会被修改。源IP地址:标识数据包的发送方。在TCP/IP 协议栈中,源IP地址通常由操作系统自动填写,取自发送网络接口的IP地址。但在某些场景下(如NAT、代理、负载均衡),源IP地址可能会被修改。   目的IP地址:标识数据包的接收方。应用程序在建立连接时指定目的IP地址,操作系统根据目的IP地址进行路由选择,决定数据包的发送路径。目的IP地址:标识数据包的接收方。应用程序在建立连接时指定目的IP地址,操作系统根据目的IP地址进行路由选择,决定数据包的发送路径。

6.2 路由决策

当主机发送数据包时,操作系统需要进行路由决策:   检查目的IP地址是否与本机在同一子网。如果是,直接使用ARP 协议获取目的主机的MAC 地址,进行局域网内直接通信。   如果目的IP地址不在同一子网,则将数据包发送给默认网关(路由器)。路由器根据目的IP地址查询路由表,决定下一跳。   数据包经过多个路由器的转发,最终到达目的网络,再由目的网络内的路由器或交换机将数据包交付给目的主机。

#mermaid-svg-QhJlWcVpoBw3gjlN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QhJlWcVpoBw3gjlN .error-icon{fill:#552222;}#mermaid-svg-QhJlWcVpoBw3gjlN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QhJlWcVpoBw3gjlN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QhJlWcVpoBw3gjlN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QhJlWcVpoBw3gjlN .marker.cross{stroke:#333333;}#mermaid-svg-QhJlWcVpoBw3gjlN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QhJlWcVpoBw3gjlN p{margin:0;}#mermaid-svg-QhJlWcVpoBw3gjlN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster-label text{fill:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster-label span{color:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster-label span p{background-color:transparent;}#mermaid-svg-QhJlWcVpoBw3gjlN .label text,#mermaid-svg-QhJlWcVpoBw3gjlN span{fill:#333;color:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN .node rect,#mermaid-svg-QhJlWcVpoBw3gjlN .node circle,#mermaid-svg-QhJlWcVpoBw3gjlN .node ellipse,#mermaid-svg-QhJlWcVpoBw3gjlN .node polygon,#mermaid-svg-QhJlWcVpoBw3gjlN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QhJlWcVpoBw3gjlN .rough-node .label text,#mermaid-svg-QhJlWcVpoBw3gjlN .node .label text,#mermaid-svg-QhJlWcVpoBw3gjlN .image-shape .label,#mermaid-svg-QhJlWcVpoBw3gjlN .icon-shape .label{text-anchor:middle;}#mermaid-svg-QhJlWcVpoBw3gjlN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QhJlWcVpoBw3gjlN .rough-node .label,#mermaid-svg-QhJlWcVpoBw3gjlN .node .label,#mermaid-svg-QhJlWcVpoBw3gjlN .image-shape .label,#mermaid-svg-QhJlWcVpoBw3gjlN .icon-shape .label{text-align:center;}#mermaid-svg-QhJlWcVpoBw3gjlN .node.clickable{cursor:pointer;}#mermaid-svg-QhJlWcVpoBw3gjlN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QhJlWcVpoBw3gjlN .arrowheadPath{fill:#333333;}#mermaid-svg-QhJlWcVpoBw3gjlN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QhJlWcVpoBw3gjlN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QhJlWcVpoBw3gjlN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QhJlWcVpoBw3gjlN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QhJlWcVpoBw3gjlN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QhJlWcVpoBw3gjlN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster text{fill:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN .cluster span{color:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QhJlWcVpoBw3gjlN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QhJlWcVpoBw3gjlN rect.text{fill:none;stroke-width:0;}#mermaid-svg-QhJlWcVpoBw3gjlN .icon-shape,#mermaid-svg-QhJlWcVpoBw3gjlN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QhJlWcVpoBw3gjlN .icon-shape p,#mermaid-svg-QhJlWcVpoBw3gjlN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QhJlWcVpoBw3gjlN .icon-shape .label rect,#mermaid-svg-QhJlWcVpoBw3gjlN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QhJlWcVpoBw3gjlN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QhJlWcVpoBw3gjlN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QhJlWcVpoBw3gjlN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

是

否

否

是

发送数据包

目的IP在同一子网?

ARP获取目的MAC

直接发送

发送给默认网关

路由器查询路由表

到达目的网络?

转发到下一跳路由器

交付给目的主机

6.3 NAT 与端口映射

在 IPv4 地址短缺的情况下,NAT(网络地址转换) 技术被广泛使用。NAT 允许多台内网主机共享一个公网 IP 地址访问互联网。   NAT 设备(通常是路由器) 维护一张 NAT 转换表,,记录内网 IP 和端口与外网 IP 和端口的映射关系。当内网主机发送数据包时,NAT 设备将源 IP 地址替换为公网 IP 地址,并分配一个临时的源端口号;当收到回复数据包时,NAT 设备根据目的端口号查询 NAT 表,将数据包转发给对应的内网主机。

#mermaid-svg-Ix1brHzkcOzfwY69{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ix1brHzkcOzfwY69 .error-icon{fill:#552222;}#mermaid-svg-Ix1brHzkcOzfwY69 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ix1brHzkcOzfwY69 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ix1brHzkcOzfwY69 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ix1brHzkcOzfwY69 .marker.cross{stroke:#333333;}#mermaid-svg-Ix1brHzkcOzfwY69 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ix1brHzkcOzfwY69 p{margin:0;}#mermaid-svg-Ix1brHzkcOzfwY69 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster-label text{fill:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster-label span{color:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster-label span p{background-color:transparent;}#mermaid-svg-Ix1brHzkcOzfwY69 .label text,#mermaid-svg-Ix1brHzkcOzfwY69 span{fill:#333;color:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 .node rect,#mermaid-svg-Ix1brHzkcOzfwY69 .node circle,#mermaid-svg-Ix1brHzkcOzfwY69 .node ellipse,#mermaid-svg-Ix1brHzkcOzfwY69 .node polygon,#mermaid-svg-Ix1brHzkcOzfwY69 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ix1brHzkcOzfwY69 .rough-node .label text,#mermaid-svg-Ix1brHzkcOzfwY69 .node .label text,#mermaid-svg-Ix1brHzkcOzfwY69 .image-shape .label,#mermaid-svg-Ix1brHzkcOzfwY69 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ix1brHzkcOzfwY69 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ix1brHzkcOzfwY69 .rough-node .label,#mermaid-svg-Ix1brHzkcOzfwY69 .node .label,#mermaid-svg-Ix1brHzkcOzfwY69 .image-shape .label,#mermaid-svg-Ix1brHzkcOzfwY69 .icon-shape .label{text-align:center;}#mermaid-svg-Ix1brHzkcOzfwY69 .node.clickable{cursor:pointer;}#mermaid-svg-Ix1brHzkcOzfwY69 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ix1brHzkcOzfwY69 .arrowheadPath{fill:#333333;}#mermaid-svg-Ix1brHzkcOzfwY69 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ix1brHzkcOzfwY69 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ix1brHzkcOzfwY69 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ix1brHzkcOzfwY69 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ix1brHzkcOzfwY69 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ix1brHzkcOzfwY69 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster text{fill:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 .cluster span{color:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ix1brHzkcOzfwY69 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ix1brHzkcOzfwY69 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ix1brHzkcOzfwY69 .icon-shape,#mermaid-svg-Ix1brHzkcOzfwY69 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ix1brHzkcOzfwY69 .icon-shape p,#mermaid-svg-Ix1brHzkcOzfwY69 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ix1brHzkcOzfwY69 .icon-shape .label rect,#mermaid-svg-Ix1brHzkcOzfwY69 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ix1brHzkcOzfwY69 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ix1brHzkcOzfwY69 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ix1brHzkcOzfwY69 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

互联网

内网

源:192.168.1.10:8888

源:203.0.113.1:50001

目的:203.0.113.1:50001

目的:192.168.1.10:8888

源:192.168.1.20:9999

源:203.0.113.1:50002

目的:203.0.113.1:50002

目的:192.168.1.20:9999

主机A192.168.1.10:8888

主机B192.168.1.20:9999

NAT路由器公网IP: 203.0.113.1

服务器198.51.100.1:80

七、进程间通信与网络通信的统一

7.1 本地进程间通信

在同一台主机上,**进程间通信(IPC)**有多种方式:管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)等。这些机制都属于 System V IPC 或 POSIX IPC 标准。

7.2 网络通信的本质也是进程间通信

网络通信的本质,实际上是跨主机的进程间通信。网络通信的本质,实际上是跨主机的进程间通信。无论是本地通信还是网络通信,最终都是将数据从一个进程传递到另一个进程。区别在于:   本地通信:数据在同一台主机的内存中传递,不需要经过网络协议栈。本地通信:数据在同一台主机的内存中传递,不需要经过网络协议栈。   网络通信:数据需要经过网络协议栈的封装,通过物理介质传输到另一台主机,再经过协议栈解封装,最终交付给目标进程。网络通信:数据需要经过网络协议栈的封装,通过物理介质传输到另一台主机,再经过协议栈解封装,最终交付给目标进程。   Socket 接口的设计巧妙地统一了这两种通信方式。在 Linux 系统中,本地通信可以使用 Unix 域套接字(Unix Domain Socket),它使用文件系统路径作为地址,数据在内核中直接传递,效率高于网络套接字。而网络套接字则使用 IP 地址和端口号作为地址,数据通过网络传输。

#mermaid-svg-ACfqVPi9vZ7a9ftl{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ACfqVPi9vZ7a9ftl .error-icon{fill:#552222;}#mermaid-svg-ACfqVPi9vZ7a9ftl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ACfqVPi9vZ7a9ftl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .marker.cross{stroke:#333333;}#mermaid-svg-ACfqVPi9vZ7a9ftl svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ACfqVPi9vZ7a9ftl p{margin:0;}#mermaid-svg-ACfqVPi9vZ7a9ftl .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster-label text{fill:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster-label span{color:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster-label span p{background-color:transparent;}#mermaid-svg-ACfqVPi9vZ7a9ftl .label text,#mermaid-svg-ACfqVPi9vZ7a9ftl span{fill:#333;color:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .node rect,#mermaid-svg-ACfqVPi9vZ7a9ftl .node circle,#mermaid-svg-ACfqVPi9vZ7a9ftl .node ellipse,#mermaid-svg-ACfqVPi9vZ7a9ftl .node polygon,#mermaid-svg-ACfqVPi9vZ7a9ftl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .rough-node .label text,#mermaid-svg-ACfqVPi9vZ7a9ftl .node .label text,#mermaid-svg-ACfqVPi9vZ7a9ftl .image-shape .label,#mermaid-svg-ACfqVPi9vZ7a9ftl .icon-shape .label{text-anchor:middle;}#mermaid-svg-ACfqVPi9vZ7a9ftl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .rough-node .label,#mermaid-svg-ACfqVPi9vZ7a9ftl .node .label,#mermaid-svg-ACfqVPi9vZ7a9ftl .image-shape .label,#mermaid-svg-ACfqVPi9vZ7a9ftl .icon-shape .label{text-align:center;}#mermaid-svg-ACfqVPi9vZ7a9ftl .node.clickable{cursor:pointer;}#mermaid-svg-ACfqVPi9vZ7a9ftl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .arrowheadPath{fill:#333333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ACfqVPi9vZ7a9ftl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ACfqVPi9vZ7a9ftl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ACfqVPi9vZ7a9ftl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster text{fill:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl .cluster span{color:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ACfqVPi9vZ7a9ftl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ACfqVPi9vZ7a9ftl rect.text{fill:none;stroke-width:0;}#mermaid-svg-ACfqVPi9vZ7a9ftl .icon-shape,#mermaid-svg-ACfqVPi9vZ7a9ftl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ACfqVPi9vZ7a9ftl .icon-shape p,#mermaid-svg-ACfqVPi9vZ7a9ftl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ACfqVPi9vZ7a9ftl .icon-shape .label rect,#mermaid-svg-ACfqVPi9vZ7a9ftl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ACfqVPi9vZ7a9ftl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ACfqVPi9vZ7a9ftl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ACfqVPi9vZ7a9ftl :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

不同主机

网络套接字TCP/IP

进程A主机1

进程B主机2

同一主机

Unix域套接字

进程A

进程B

7.3 为什么需要端口号而不是PID

一个常见的问题是:操作系统已经有进程 ID(PID)来标识进程了,为什么网络通信还需要引入端口号?   原因在于:   PID 是操作系统内部概念:PID 是操作系统分配给进程的本地标识,不同主机上的 PID 可能重复,无法在全球范围内唯一标识一个网络进程。   网络通信需要稳定的标识:进程的 PID 可能在进程重启后改变,但网络服务通常需要绑定到固定的端口号,以便客户端能够持续访问。   一个进程可以提供多个服务:一个进程可能同时提供多种网络服务(如同时监听 HTTP 和 HTTPS),使用不同的端口号可以区分这些服务。   端口号的层次更高:PID 是操作系统调度管理的概念,而端口号是网络通信的概念。将两者解耦,使得网络通信不依赖于特定的操作系统实现。

八、总结与展望

本文从网络协议的本质出发,系统梳理了网络通信的核心概念和机制:   协议的分层设计解决了网络通信的复杂性问题,每一层专注于特定的职责,通过定义良好的接口协同工作。   IP 地址和端口号共同构成了网络通信的寻址体系,IP 地址标识主机,端口号标识主机上的进程,四元组唯一标识一个通信连接。   Socket 编程接口为应用程序提供了简洁的网络通信能力,封装了底层协议的复杂性。   操作系统内核通过中断处理、协议栈解析、套接字匹配等机制,确保数据能够准确、高效地交付给目标进程。   协议的本质是结构体,这一认识有助于我们从编程的角度理解网络协议的设计和实现。   随着技术的发展,网络通信也在不断演进。IPv6 正在逐步替代 IPv4,提供更大的地址空间和更好的安全性;QUIC 协议基于 UDP 实现了类似 TCP 的可靠性,同时降低了连接建立延迟;HTTP/3 基于 QUIC,进一步提升了Web性能。但无论技术如何发展,本文所阐述的基本原理——分层设计、寻址机制、封装解封装、进程间通信——始终是理解网络通信的基石。

赞(0)
未经允许不得转载:171主机测评 » 网络协议与通信原理深度解析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址