1 网络基础概念目录计算机网络背景初识协议协议分层OSI 七层模型TCP/IP 五层四层模型再识协议为什么要有 TCP/IP网络传输基本流程局域网通信原理数据的封装与分用跨网络传输认识 IP 地址与路由器Socket 编程预备1. 源 IP 与目的 IP2. 端口号3. 传输层典型代表TCP 与 UDP4. 网络字节序5. socket 编程接口一、计算机网络背景1.1 网络发展计算机网络的发展经历了以下几个阶段阶段说明独立模式计算机之间相互独立每个终端 A、B、C 各自持有客户数据人员运行业务时需移动到对应主机前例小松运行业务①运行业务②时要移动到 B 主机前小竹要等小松处理完才能操作小梅要等小松、小竹都处理完才能工作网络互联多台计算机连接在一起完成数据共享。典型场景每台计算机使用各自独立计算机业务①、②、③之间可随时自由切换共享数据由服务器集中管理局域网 LAN计算机数量更多了通过交换机和路由器连接在一起广域网 WAN将远隔千里的计算机都连在一起要点所谓局域网和广域网只是一个相对的概念。比如一个较大的广域网也可以看作一个比较大的局域网如由大阪、东京、福冈、名古屋、洛杉矶等 LAN 通过路由器、交换机互联组成的广域网拓扑。必然性计算机是人的工具人要协同工作注定了网络的产生是必然的。二、初识协议2.1 协议是一种约定协议是一种约定。生活类比打电话约定电话铃响的次数。计算机之间的传输媒介是光信号和电信号通过频率和强弱来表示 0 和 1 这样的信息。要想传递各种不同的信息就需要约定好双方的数据格式。2.2 思考只要通信的两台主机约定好协议就可以了吗不行。原因定好协议但你用频率表示 0/1我用强弱表示 0/1就好比我说中国话、你说葡萄牙语——虽然大家遵守同一套通信规则但语言不同即使订好了基本协议也无法正常通信。所以完善的协议需要更多更细致的规定并让参与的人都要遵守。2.3 为什么需要统一的标准现实中存在大量差异计算机生产厂商有很多计算机操作系统也有很多计算机网络硬件设备还是有很多。结论要让不同厂商生产的计算机能够相互顺畅地通信就需要有人站出来约定一个共同的标准大家都来遵守——这就是网络协议。2.4 能定制协议标准的组织或公司一般具有定制协议或标准资格的组织/公司都必须是业界公认或具有江湖地位的组织或公司国际标准化组织IEEE电气和电子工程师协会由计算机和工程领域专家组成的庞大技术组织制定了全世界电子、电气和计算机科学领域约 30% 的标准包括 IEEE 802 系列标准涵盖 LAN 到 WAN 等多种网络技术。ISO国际标准化组织由多个国家标准化团体组成的国际组织以开放系统互连OSI模型的工作著称定义了网络通信的七层协议结构。ITU国际电信联盟联合国下属专门机构负责制定电信领域国际标准ITU-T 标准覆盖电话和网络通信与 ISO 合作保证通信技术全球兼容性与互操作性。区域标准化组织ETSI欧洲电信标准学会由欧洲共同体各国政府资助电信厂商与研究机构参与从事研究开发到标准制定。ASTAP亚洲与泛太平洋电信标准化协会1998 年由日本与韩国发起成立加强亚太地区各国信息通信基础设施及其相互连接的标准化协作。公司某些公司如泰凌微自研各种标准的软件协议栈低功耗蓝牙、zigbee、thread 及 Matter 等可定制化改动是其核心竞争力之一。民间国际团体IETF互联网工程师任务组负责开发和推广互联网协议特别是构成 TCP/IP 协议族的协议的志愿组织通过RFC发布新的或取代老的标准。官方机构FCC联邦通信委员会美国管理通信技术的官方机构通过管理无线电、电视和有线通信保护公众利益也对通信产品技术特性进行审查和监督。以上组织或公司都能在一定程度上定制协议标准以满足特定需求或推动技术发展。三、协议分层OSI 七层模型3.1 为什么协议要分层协议本质也是软件在设计上为了更好地进行模块化、解耦合被设计成层状结构。生活类比A 与 C 通信初始场景A、C 通过汉语协议在语言层沟通借助电话机通信设备层传输。场景一仅在通信设备层变更电话机换成无线电语言层仍用汉语协议通信照常场景二仅在语言层变更汉语协议换成英语协议通信设备层保持电话机不变通信照常。→ 说明分层可以实现解耦合让软件维护的成本更低。该例子中协议只有两层语言层、通信设备层实际的网络通信协议设计更复杂需要分更多的层。3.2 OSI 七层模型OSIOpen System Interconnection开放系统互连七层网络模型称为开放式系统互联参考模型是一个逻辑上的定义和规范。把网络从逻辑上分为 7 层每一层都有相关、相对应的物理设备如路由器、交换机。是一种框架性的设计方法最主要的功能是帮助不同类型的主机实现数据传输。最大优点将服务、接口和协议三个概念明确地区分开来概念清楚、理论完整通过七个层次化的结构模型使不同的系统、不同的网络之间实现可靠的通讯。缺点既复杂又不实用所以课程按 TCP/IP 四层模型讲解。3.3 OSI 七层各层功能一览层号分层名称功能每层功能概览7应用层针对特定应用的协议针对每个应用的协议电子邮件/电子邮件协议、远程登录/远程登录协议、文件传输/文件传输协议6表示层设备固有数据格式和网络标准数据格式的转换接收不同表现形式的信息如文字流、图像、声音等网络标准格式5会话层通信管理负责建立和断开通信连接数据流动的逻辑通路管理传输层以下的分层何时建立连接、何时断开连接以及保持多久的连接4传输层管理两个节点之间的数据传输负责可靠传输确保数据被可靠地传送到目标地址是否有数据丢失3网络层地址管理与路由选择经过哪个路由传递到目标地址2数据链路层互连设备之间传送和识别数据帧数据帧与比特流之间的转换、分段转发1物理层以01代表电压的高低、灯光的闪灭界定连接器和网线的规格比特流与电子信号之间的切换连接器与网线的规格工程实践补充从网络角度看OSI 七层模型非常完善但在实际操作中会话层、表示层是不可能接入到操作系统中的所以工程实践中最终落地的是5 层协议。四、TCP/IP 五层四层模型TCP/IP 是一组协议的代名词它还包括许多协议组成了TCP/IP 协议簇。TCP/IP 通讯协议采用 5 层的层级结构每一层都呼叫它的下一层所提供的网络来完成自己的需求。4.1 五层职责与对应设备层次职责相关概念/设备物理层负责光/电信号的传递方式现在以太网通用的网线双绞线、早期以太网采用的同轴电缆现主要用于有线电视、光纤、现在的 wifi 无线网使用的电磁波等都属于物理层概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器Hub工作在物理层数据链路层负责设备之间的数据帧的传送和识别网卡设备的驱动、帧同步从网线上检测到什么信号算作新帧的开始、冲突检测检测到冲突自动重发、数据差错校验等。有以太网、令牌环网、无线 LAN 等标准。交换机Switch工作在数据链路层网络层负责地址管理和路由选择在 IP 协议中通过 IP 地址标识一台主机并通过路由表规划出两台主机之间数据传输的线路路由。路由器Router工作在网络层传输层负责两台主机之间的数据传输如传输控制协议TCP确保数据可靠地从源主机发送到目标主机应用层负责应用程序间沟通简单电子邮件传输SMTP、文件传输协议FTP、网络远程访问协议Telnet等。网络编程主要就是针对应用层4.2 为什么常说四层模型物理层我们考虑得比较少只考虑软件相关的内容因此很多时候直接称为TCP/IP 四层模型应用层、传输层、网络层、数据链路层。4.3 各设备实现的协议层一般而言设备实现的协议层一台主机操作系统内核实现了从传输层到物理层的内容一台路由器实现了从网络层到物理层一台交换机实现了从数据链路层到物理层集线器只实现了物理层并不绝对很多交换机也实现了网络层的转发很多路由器也实现了部分传输层的内容比如端口转发。4.4 OSI 参考模型与 TCP/IP 分层模型对比OSI 参考模型应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。TCP/IP 分层模型应用层DNS, URI, HTML, HTTP, TLS/SSL, SMTP, POP, IMAP, MIME, TELNET, SSH, FTP, SNMP, MIB, SIP, RTP, LDAP —— 对应应用程序传输层TCP, UDP, UDP-Lite, SCTP, DCCP —— 对应操作系统互联网层ARP, IP, ICMP —— 对应操作系统网卡层硬件—— 对应设备驱动程序与网络接口五、再识协议为什么要有 TCP/IP5.1 单机内部也有协议即便是单机计算机内部也存在协议例如其他设备和内存通信 → 内存协议其他设备和磁盘通信 → 磁盘相关协议如SATA、IDE、SCSI等。只不过我们感知不到且这些协议都在本地主机各自的硬件中通信成本、问题比较少。5.2 网络通信的本质变化网络通信最大的特点就是主机之间变远了。任何通信特征的变化一定会带来新的问题有问题就得解决问题所以需要新的协议。主机 A 想给距离很远的主机 C 发数据会遇到的问题我要发数据给主机 C得先发到路由器 R 吧怎么办网上这么多主机怎么定位并找到主机 C 呢怎么办如果我的数据发出去丢失了怎么办发数据不是目的只是手段用数据才是目的。主机 C 怎么知道我发出去的数据该怎么被处理、被使用呢结论为什么要有 TCP/IP 协议本质就是通信主机距离变远了。不同性质、不同种类的问题 → 协议分层来解决。5.3 什么是 TCP/IP 协议TCP/IP 协议的本质是一种解决方案。TCP/IP 协议能分层前提是因为问题们本身能分层。5.4 TCP/IP 协议与操作系统的关系宏观实现所有主机上安装的操作系统可以不同事实也就是不同但所有主机上的协议栈必须按照标准进行相同的实现——这就是不同主机可以互相通信的秘密。分层实现位置Windows 与 Linux 的协议栈都如此应用层在 OS 上层由用户实现网络层、传输层两层集成在操作系统内核中传输层最著名的协议是 TCP网络层最著名的协议是 IPTCP 和 IP 是核心整体统称为 TCP/IP 不过分数据链路层在驱动程序中网卡底层硬件。整个协议栈既涉及硬件又涉及驱动又涉及 OS甚至用户——所以这个协议需要 IT 各行各业都进行支持和配合。网络属于 OSOS 不相信任何用户用户要访问网络功能必须通过系统调用。5.5 究竟什么是协议朴素理解OS 源代码一般用 C/C 语言编写。假设在任意一层定义一个结构体structprotocol{inta;intb;intc;};structprotocoldata{10,20,30};主机 A 发送结构体对象data给主机 B。问题主机 B 能识别 data并准确提取 a10、b20、c30 吗回答答案是肯定的因为双方都有同样的结构体类型struct protocol。用同样的代码实现协议、用同样的自定义数据类型天然就具有共识能够识别对方发来的数据——这不就是约定吗关于协议的朴素理解所谓协议就是通信双方都认识的结构化的数据类型。因为协议栈是分层的所以每层双方都有协议同层之间互相可以认识对方的协议。六、网络传输基本流程局域网通信原理6.1 局域网以太网为例通信原理生活类比网络购物、快递单的例子。核心问题两台主机在同一个局域网是否能够直接通信—— 可以原理类似上课点名。每台主机在局域网上要有唯一的标识来保证主机的唯一性MAC 地址。6.2 认识 MAC 地址MAC 地址用来识别数据链路层中相连的节点。长度为48 比特位即 6 个字节一般用 16 进制数字加上冒号的形式表示例如08:00:27:03:fb:19。在网卡出厂时就确定了不能修改MAC 地址通常是唯一的虚拟机中的 MAC 地址不是真实的 MAC 地址可能会冲突也有些网卡支持用户配置 MAC 地址。Windows 下查看命令ipconfig /all。后面详细讨论数据链路层时会讲 MAC 帧协议此处了解即可。6.3 以太网发送规则以太网中主机 A → 主机 E 发数据的过程帧内容src: MacA, dst: MacE, data: 你好数据发送到局域网所有主机都能收到广播特性主机 B我是主机 B我的 MAC 是 MacB这个报文不是给我的丢弃主机 C俺也一样丢弃主机 D俺也一样丢弃主机 E我就是 MacE发给我的我以同样的方式返回。关键规则没有交换机的情况下一个以太网就是一个碰撞域以太网中任何时刻只允许一台机器向网络中发送数据如果有多台同时发送会发生数据干扰称之为数据碰撞所有发送数据的主机要进行碰撞检测和碰撞避免局域网通信过程中主机对收到的报文确认是否是发给自己的是通过目标 MAC 地址判定。6.4 同网段两台主机发送消息系统角度用户 A主机 1向用户 B主机 2发送你好的流程应用层 → 传输层 → 网络层 → 数据链路层 → 网卡 → …… → 对端网卡 → 数据链路层 → 网络层 → 传输层 → 应用层其中每层都有协议所以传输流程中要进行封装和解包同层之间都认为自己在和对方同层协议直接通信虚拟通信封装的过程发送方自上而下逐层加报头应用层报头 你好 传输层报头 应用层报头 你好 网络报头 传输层报头 应用层报头 你好 链路报头 网络报头 传输层报头 应用层报头 你好解包和分用的过程接收方自下而上逐层剥掉报头。七、数据的封装与分用7.1 基本概念报头header对应协议层的结构体字段一般叫做报头有效载荷payload除了报头剩下的部分报文 报头 有效载荷。7.2 不同协议层对数据包的称谓协议层数据包称谓传输层段segment网络层数据报datagram链路层帧frame7.3 封装Encapsulation应用层数据通过协议栈发到网络上时每层协议都要加上一个数据首部header称为封装。首部信息中包含首部有多长、载荷payload有多长、上层协议是什么等信息。数据封装成帧后发到传输介质上。7.4 解封装分用到达目的主机后每层协议再剥掉相应的首部根据首部中的上层协议字段将数据交给对应的上层协议处理。7.5 封装过程图示各层首部与字节数用户数据 ┌────────────┬──────────────┐ │ Appl 首部 │ 用户数据 │ └────────────┴──────────────┘ ┌─────────┬────────────┬──────────────┐ │ TCP 首部│ 应用数据 │ │ → TCP 段 └─────────┴────────────┴──────────────┘ ┌────────┬─────────┬────────────┬──────────────┐ │ IP首部 │ TCP首部 │ 应用数据 │ │ → IP 数据报 │ (20字节)│ (20字节)│ │ │ └────────┴─────────┴────────────┴──────────────┘ ┌──────────┬────────┬─────────┬────────────┬──────────────┬──────────┐ │以太网首部 │ IP首部 │ TCP首部 │ 应用数据 │ │以太网尾部 │ │ (14字节) │ (20字节)│(20字节) │ │ │ (4字节) │ └──────────┴────────┴─────────┴────────────┴──────────────┴──────────┘ 以太网帧46 ~ 1500 字节层级传递应用程序 → TCP → IP → 以太网驱动程序 → 以太网。7.6 分用过程图示进入的帧 → 以太网驱动程序根据以太网首部中的帧类型进行分用→ ARP / RARP / IPIP 模块根据 IP 首部中的协议值进行分用→ ICMP / IGMP / TCP / UDPTCP 和 UDP根据 TCP 或 UDP 首部中的端口号进行分用→ 各应用程序。八、跨网络传输认识 IP 地址与路由器8.1 认识 IP 地址IP 协议有两个版本IPv4 和 IPv6。本课程凡是提到 IP 协议没有特殊说明的默认都指IPv4。IP 地址是在 IP 协议中用来标识网络中不同主机的地址。对于 IPv4 来说IP 地址是一个4 字节、32 位的整数。通常使用点分十进制的字符串表示 IP 地址例如192.168.0.1用点分割的每一个数字表示一个字节范围是0 - 255。跨网段主机间的数据传输数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。8.2 为什么要去目标主机先要走路由器目的 IP 的意义路由主机发现不是发给本局域网主机的报文就推送给路由器。示例用户 Asrc: 192.168.2.2 → dst: 172.168.2.2data: 你好发现目标 IP 不属于本地局域网先把报文交给路由器本网网关192.168.2.1对端172.168.2.1。8.3 路由器解包和重新封装跨网段传输时用户 A 发送数据封装src: macA, dst: macLeft下一跳路由器左侧网卡 MACsrc: 192.168.2.2, dst: 172.168.2.2, data: 你好路由器解包解掉数据链路层的帧头向上交付到网络层看目的 IP路由器路由根据目的 IP 决定下一跳路由器重新封装新的帧头src: macRight, dst: macB网络层及以上内容原样保留用户 B 继续向上交付。8.4 对比 IP 地址和 MAC 地址的区别对比项IP 地址MAC 地址在整个路由过程中一直不变目前只能这样说明后面再修正一直在变逐跳变化角色目的 IP 是一种长远目标是路径选择的重要依据MAC 是下一阶段目标是局域网转发的重要依据8.5 提炼 IP 网络的意义和网络通信的宏观流程跨网络传输的宏观流程用户 A → 应用层 → 传输层 → 网络层 → 数据链路层 → 网卡 → …… → 路由器网络层/数据链路层/网卡→ …… → 用户 B。IP 网络层存在的意义提供网络虚拟层让全世界的所有网络都是 IP 网络屏蔽最底层网络的差异例如底层既可以是以太网也可以是令牌环网上层统一走 IP。九、Socket 编程预备1. 理解源 IP 地址和目的 IP 地址IP 在网络中用来标识主机的唯一性。注意后面会讲 IP 的分类详细阐述 IP 的特点。思考数据传输到主机是目的吗不是的。因为数据是给人用的聊天是人在聊下载是人在下载浏览网页是人在浏览。人通过启动的qq、迅雷、浏览器看到聊天信息、执行下载任务、浏览网页信息。而启动的 qq、迅雷、浏览器都是进程。进程是人在系统中的代表——只要把数据给进程人就相当于拿到了数据。所以数据传输到主机不是目的而是手段到达主机内部再交给主机内的进程才是目的。但系统中同时存在非常多的进程当数据到达目标主机之后怎么转发给目标进程这就要在网络背景下、在系统中标识主机的唯一性IP 标识主机端口号标识进程。2. 认识端口号端口号port是传输层协议的内容。端口号是一个2 字节 16 位的整数。端口号用来标识一个进程告诉操作系统当前的这个数据要交给哪一个进程来处理。IP 地址 端口号能够标识网络上的某一台主机的某一个进程。一个端口号只能被一个进程占用一个进程可以绑定多个端口号但一个端口号不能被多个进程绑定。端口号范围划分范围说明0 - 1023知名端口号HTTP、FTP、SSH 等广为使用的应用层协议它们的端口号是固定的1024 - 65535操作系统动态分配的端口号客户端程序的端口号由操作系统从这个范围分配理解端口号和进程 ID之前学习系统编程时pid表示唯一一个进程此处端口号也是唯一标识一个进程。两者是什么关系进程 PID 属于系统概念技术上具有唯一性确实可以用来标识唯一进程但这样做会让系统进程管理和网络强耦合实际设计时并没有选择这样做类比 10086 例子客服总机号码唯一但内部还要再分线到具体话务员。理解源端口号和目的端口号传输层协议TCP 和 UDP的数据段中有两个端口号源端口号和目的端口号描述的是数据是谁发的要发给谁。3. 理解 socket套接字综上IP 地址用来标识互联网中唯一的一台主机port 用来标识该主机上唯一的一个网络进程。IP Port 就能表示互联网中唯一的一个进程。通信的时候本质上是两个互联网进程代表人来进行通信。{srcIp, srcPort, dstIp, dstPort}这样的4 元组就能标识互联网中唯二的两个进程。所以网络通信的本质也是进程间通信。我们把ip port 叫做套接字 socket。socket 英文释义n.电源插座、电器上的插口、插孔、管座等vt. 把……装入插座、给……配插座。传输层的典型代表TCP / UDP如果我们了解了系统也了解了网络协议栈就会清楚传输层属于内核要通过网络协议栈进行通信必定调用的是传输层提供的系统调用来进行网络通信。认识 TCP 协议Transmission Control Protocol传输控制协议此处先有直观认识细节后面讨论特性说明传输层协议TCP 属于传输层有连接通信前需建立连接可靠传输保证数据可靠送达面向字节流数据以字节流方式传输认识 UDP 协议User Datagram Protocol用户数据报协议后面再详细讨论特性说明传输层协议UDP 属于传输层无连接无需建立连接不可靠传输不保证可靠送达面向数据报数据以数据报方式传输因为暂时还没有深入了解 TCP、UDP 协议此处只做了解即可。4. 网络字节序内存中的多字节数据相对于内存地址有大端和小端之分磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分网络数据流同样有大端小端之分。如何定义网络数据流的地址发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出接收主机把从网络上接到的字节依次保存在接收缓冲区中也是按内存地址从低到高的顺序保存因此规定先发出的数据是低地址后发出的数据是高地址。TCP/IP 协议规定网络数据流应采用大端字节序即低地址高字节。不管这台主机是大端机还是小端机都会按照 TCP/IP 规定的网络字节序来发送/接收数据如果当前发送主机是小端就需要先将数据转成大端否则直接发送即可。大小端存储示例将0x1234abcd写入到以 0x0000 开始的内存中内存地址big-endianlittle-endian0x00000x120xcd0x00010x340xab0x00020xab0x340x00030xcd0x12字节序转换库函数为使网络程序具有可移植性使同样的 C 代码在大端和小端计算机上编译后都能正常运行#includearpa/inet.huint32_thtonl(uint32_thostlong);// host → network, 32 位长整数uint16_thtons(uint16_thostshort);// host → network, 16 位短整数uint32_tntohl(uint32_tnetlong);// network → host, 32 位长整数uint16_tntohs(uint16_tnetshort);// network → host, 16 位短整数函数名记忆h host主机n network网络l 32 位长整数s 16 位短整数。例如htonl表示将 32 位长整数从主机字节序转换为网络字节序例如将 IP 地址转换后准备发送。如果主机是小端字节序这些函数将参数做相应的大小端转换然后返回如果主机是大端字节序这些函数不做转换将参数原封不动地返回。网络规定所有发送到网络上的数据都必须是大端的5. socket 编程接口socket 常见 API// 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器)intsocket(intdomain,inttype,intprotocol);// 绑定端口号 (TCP/UDP, 服务器)intbind(intsocket,conststructsockaddr*address,socklen_taddress_len);// 开始监听 socket (TCP, 服务器)intlisten(intsocket,intbacklog);// 接收请求 (TCP, 服务器)intaccept(intsocket,structsockaddr*address,socklen_t*address_len);// 建立连接 (TCP, 客户端)intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);sockaddr 结构socket API 是一层抽象的网络编程接口适用于各种底层网络协议如 IPv4、IPv6以及后面要讲的UNIX Domain Socket。然而各种网络协议的地址格式并不相同。三种地址结构体内存布局对比结构体字段struct sockaddr16 位地址类型 14 字节地址数据struct sockaddr_in16 位地址类型:AF_INET 16 位端口号 32 位 IP 地址 8 字节填充struct sockaddr_un16 位地址类型:AF_UNIX 108 字节路径名IPv4 和 IPv6 的地址格式定义在netinet/in.h中IPv4 地址用sockaddr_in结构体表示包括 16 位地址类型、16 位端口号和 32 位 IP 地址。IPv4、IPv6 地址类型分别定义为常数AF_INET、AF_INET6。只要取得某种 sockaddr 结构体的首地址不需要知道具体是哪种类型的 sockaddr 结构体就可以根据地址类型字段确定结构体中的内容。socket API 可以都用struct sockaddr *类型表示在使用时需要强制转化成sockaddr_in。这样做的好处是程序的通用性可以接收 IPv4、IPv6 以及 UNIX Domain Socket 各种类型的 sockaddr 结构体指针作为参数。三个核心结构体定义C 语言/* 通用地址结构体 */structsockaddr{__SOCKADDR_COMMON(sa_);/* Common data: address family and length. */charsa_data[14];/* Address data. */};/* IPv4 专用地址结构体 */structsockaddr_in{__SOCKADDR_COMMON(sin_);in_port_tsin_port;/* Port number. */structin_addrsin_addr;/* Internet address. *//* Pad to size of struct sockaddr. */unsignedcharsin_zero[sizeof(structsockaddr)-__SOCKADDR_COMMON_SIZE-sizeof(in_port_t)-sizeof(structin_addr)];};/* IPv4 地址结构体 */typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;};虽然 socket API 的接口是sockaddr但真正基于 IPv4 编程时使用的数据结构是sockaddr_in这个结构里主要有三部分信息地址类型、端口号、IP 地址。in_addr用来表示一个 IPv4 的 IP 地址其实就是一个32 位的整数。