Linux之网络(一)---socket

发布时间:2026/10/10 17:37:56

Linux之网络(一)---socket 前提知识IP 在全网范围内唯一标识一台主机。 源 IP标识数据从哪一台主机发出 目的 IP标识数据要交付到哪一台主机但是数据送到主机并不是最终目的数据最终是给人使用的聊天、下载、浏览网页。 而电脑里QQ、迅雷、浏览器本质都是进程进程是人在操作系统里的代表。真正最终目标把数据交付给目标主机上对应的进程。问题来了一台主机上同时运行几十上百个进程数据抵达主机后操作系统如何区分该交给哪一个进程只依靠 IP 地址不够还需要端口号port同一台电脑上同时跑浏览器、QQ、迅雷都会收发网络数据包。 如果没有端口号区分操作系统收到网络数据根本不知道该交给哪个软件。 端口号就相当于进程的门牌号。pid不就可以标识进程的唯一性???为什么还需要端口号??概念是什么谁在用作用范围PID进程 ID操作系统给进程分配的编号操作系统内核用仅在单台主机内部有效端口号Port网络通信中标识进程的编号网络协议栈传输层用在网络通信中有效pid是系统观念,有端口号可以对其进行解耦pid每个进程都有,但不是所有进程都需要进行通行原因 1PID 是动态的每次启动都变不稳定同一个程序比如 QQ今天启动 PID 是 1234明天重启可能就是 5678。如果网络通信靠 PID 寻址对方主机怎么知道你这次 QQ 的 PID 是多少总不能每次启动都通知全世界吧而端口号是程序自己指定 / 绑定的可以固定。比如 HTTP 服务永远绑定 80 端口不管进程 PID 怎么变客户端只要访问 80 端口就能找到服务。原因 2PID 是操作系统内部概念不同系统格式不一样Linux 的 PID 是整数Windows 的进程 ID 格式又不同其他操作系统可能还有别的实现网络是跨平台的Linux 要和 Windows 通信如果用 PID 寻址两边操作系统对 PID 的理解都不一样根本无法统一。而端口号是 TCP/IP 协议标准规定的全世界所有操作系统统一16 位无符号整数0~65535。不管什么系统端口号含义完全一致。原因 3不是所有进程都需要网络通信pid 每个进程都有但不是所有进程都需要进行通信。一台主机上同时运行几百个进程桌面进程、输入法进程、系统后台服务…… 绝大多数进程根本不收发网络数据。如果用 PID 作为网络标识等于给所有进程都分配了一个 网络地址但大部分根本用不上浪费且混乱。端口号是按需分配的只有需要网络通信的进程才会绑定端口不需要通信的进程不占端口干净高效。原因 4一个进程可以绑定多个端口一个端口只能被一个进程占用一个 Web 服务器进程可以同时绑定 80 端口HTTP和 443 端口HTTPS反过来80 端口同一时刻只能被一个进程占用如果用 PID 代替端口号一个进程只有一个 PID怎么同时提供多种网络服务做不到。端口号机制更灵活进程可以按需绑定多个端口提供多种服务。ip vs port比如我要投诉一个,先拨打,在说明工号10086 --- 4321概念电话类比作用所属分层IP 地址总机号码 (10086)定位主机哪台电脑网络层Port 端口员工工号 (4321)定位进程哪个软件传输层10086客服总机号码 ≈ IP 地址先拨打总机 10086用来定位整个客服中心一台主机保证电话可以送到这个机构。4321员工工号 ≈ 端口号 port接通总机之后再报工号 4321用来定位客服中心里具体的工作人员主机内进程。OS是如何讲收到的数据转发给特定端口的进程????端口哈希表操作系统内核会维护一张哈希表图上横向数组就是哈希桶key端口号示例8080value对应进程的 PCB /socket 缓冲区流程拿到目的端口 → 哈希运算定位桶 → 查表找到绑定该端口的 socket → 将报文放入 socket 接收缓冲区唤醒对应进程读取数据找到进程如何把网络数据,交给这个进程Linux 一切皆文件socket 本质是文件描述符 fd内核通过缓冲区完成内核态 → 用户态的数据交付端口号范围划分• 0 - 1023 : 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都 是固定的.• 1024 - 65535 : 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范 围分配的.IP 地址用来标识互联网中唯一的一台主机 port 用来标识该主机上唯一的一个网络进程IPPort 就能表示互联网中唯一的一个进程所以通信的时候本质是两个互联网进程代表人来进行通信{srcIpsrcPortdstIpdstPort} 这样的4元组就能标识互联网中唯二的两个进程所以网络通信的本质也是进程间通信网络字节序我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于 文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地 址呢?为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下 库函数做网络字节序和主机字节序的转换。网络字节序转换函数htonl/htons/ntohl/ntohs函数作用长度htonl()host‑to‑network‑long主机字节序 → 网络字节序32 位 (IP 地址)4 字节htons()host‑to‑network‑short主机字节序 → 网络字节序16 位 (端口号)2 字节ntohl()network‑to‑host‑long网络字节序 → 主机字节序32 位4 字节ntohs()network‑to‑host‑short网络字节序 → 主机字节序16 位2 字节这些函数名很好记, h 表示 host , n 表示 network , l 表示 32 位长整数, s 表示 16 位短整 数。例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发 送。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回socket编程接口socket 常见API// 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address, socklen_t address_len); // 开始监听socket (TCP, 服务器) int listen(int socket, int backlog); // 接收请求 (TCP, 服务器) int accept(int socket, struct sockaddr* address, socklen_t* address_len); // 建立连接 (TCP, 客户端) int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);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结构 体指针做为参数;
延伸阅读

更多相关文章

2026/10/8 7:30:15

强化学习稳定性优化:群体策略与可靠性导向的ProGPO方法解析

1. 项目概述:面向进展与可靠性的群体策略优化最近在强化学习社区里,一个挺有意思的讨论点就是“智能体强化学习”怎么才能更“稳”。我们训练一个智能体,比如让它在一个模拟厨房里完成“做一杯咖啡”的任务,它可能偶尔能成功&…

2026/10/6 6:20:12

TE 56G MezzaWave高速互连方案:解决数据中心与AI硬件信号完整性挑战

高速数据传输的瓶颈,往往不在芯片本身,而在于连接芯片的“最后一厘米”。当服务器、交换机、AI加速卡内部的信号速率从28G、56G向112G甚至224G迈进时,传统的连接器和线缆会迅速成为信号完整性的“短板”,导致误码率飙升、系统性能…

2026/10/7 14:13:38

Elasticsearch 8.x 面试攻坚:索引设计、向量检索与聚合性能优化实战

1. 先搞清楚 Elasticsearch 8.x 面试到底在问什么如果你正在准备后端、搜索、大数据相关的面试,尤其是涉及 Elasticsearch 的岗位,你会发现面试官的问题越来越“刁钻”。他们不再满足于你回答“什么是倒排索引”或者“怎么安装 ES”,而是会直…

2026/10/10 17:34:45

LoRA微调与知识蒸馏联合优化实战指南

1. 为什么“更省的微调”和“更小的学生”不是营销话术,而是工程落地的刚性需求LoRA 和知识蒸馏这两个词最近在大模型圈里被反复提起,但很多人一看到“微调”就下意识想到租三台A100跑一周、显存爆满、checkpoint动辄30GB——结果还没调完,预…

2026/10/10 17:34:45

从Demo到生产:Agent架构与多智能体协作实战指南

过去一年里被问得最多的问题,不是“怎么用 LangChain 写一个 Agent”,而是“写完 Demo 之后怎么办”。前后端联调跑通了,Prompt 也调得挺顺,但一放到生产环境,各种奇怪问题全冒出来:上下文错乱、工具调用超…

2026/10/10 17:34:45

Agent从Demo到生产落地:架构、多智能体与可靠性指南

这是最近被问得最多的一类问题:Agent 的 Demo 跑得风生水起,一上生产就露怯。我自己也经历过这个阶段——在内部验证会上,一个能自动查库存、写邮件、汇报结果的智能体把在场的人都看嗨了,可等它真的接到业务系统里,第…

2026/10/10 17:34:45

OpenClaw配置QQ机器人保姆级教程:WSL2+NapCat+OneBot全流程实战

很多朋友第一次接触OpenClaw,都是被那句“让你的AI自己用电脑”吸引过来的。但真到自己动手配置QQ机器人时,才发现坑远比想象中多——WSL2环境报错、Node.js版本不对、MySQL连不上、NapCat转发器配置完但消息就是发不出去……这套组合拳下来,…

2026/10/10 17:34:45

Shell 脚本入门:写好第一个脚本的必备基础

学 Linux 自动化运维,Shell 是绕不过去的第一关。这篇把「Shell 是什么、脚本怎么跑起来、变量怎么写」一次讲清,读完你能独立写出并执行第一个脚本。文中的变量基础部分与旧文《Shell 变量与环境变量》互补,重复的演示已压缩并注明去处。 本…

2026/10/10 17:29:42

LL(1)文法与四元式:IF-ELSE翻译程序的核心实现

简介:针对编译原理课程中IF-ELSE条件语句的翻译程序设计任务,这份资源提供了基于LL(1)分析法并输出四元式的完整工程实现。资源包共17个文件,压缩包仅417KB,包含Visual Studio工程文件(sln、vcproj)、C源代…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑