TCP/IP 网络模型与操作系统 Socket 通信机制的区别
TCP/IP分层模型与分层寻址体系
在 TCP/IP 网络模型中,最高层应用层面向的是具体的业务场景,所以没有统一协议地址,也是由业务决定资源标识。如:http 使用的 url,mqtt 使用的 topic。
而下三层,也就是传输层、网络层和数据链路层,这三层的任务是解决怎么把数据送到某个位置,故而在网络体系结构中有一套统一的寻址体系规则。
-
数据链路层实现设备到设备的数据传输,即当前这一段链路上,数据帧应该交给哪个设备,通过MAC地址标识局域网内的网络接口(网卡);
-
网络层实现主机到主机的数据传输,即数据应该送到哪台主机。通过 IP地址 标识网络中的主机;
-
传输层实现端到端的数据传输,即数据应该送到目标主机的哪个应用实体(通常是进程),通过 端口号 标识网络通信进程;
TCP/IP 协议栈在 OS 中实现
在操作系统中,TCP/IP 协议栈在内核实现,具体表现为一套完成网络通信中的封装、传输控制、寻址等功能的代码。如:TCP、UDP的实现,IP 路由模块等。
若直接让应用层程序调用内核 TCP/IP协议栈 会很复杂,故而在设计操作系统的时候,提供了一套编程接口(socket),程序只需要调用这些接口就可以实现通信相关的功能,从而将复杂的操作给简化。
socket 如何连接应用和协议栈
将 TCP/IP 协议栈类比为一家物流公司,责快递的打包、分拣、运输、派送。将应用程序类比为寄件人,如果自行找物流公司就很麻烦,socket 可以类比为快递下单平台,只需要在平台下单,后续的打包、分拣、运输、派送这些就由物流公司来自行完成了。
抽象理解 TCP/IP 模型时,也就是纯考虑 TCP/IP 模型时,一般将端口理解为用于标识主机上的网络通信进程;而在操作系统实际实现中,端口属于 socket 绑定的网络通信端点,socket 对象由进程创建和使用,内核通过维护 socket 对象管理网络通信。
进程 --- > socket 对象 ---> 内核(TCP/IP协议栈)---> 网卡
Linux网络工具与socket关系
一个 socket对象 一般包含 源端口、目的端口、IP地址、协议类型、状态信息、 网卡信息、关联进程信息等;
所以这也就是为什么在Linux 中,使用 ss、netstat 看到是 socket 信息,因为内核真正维护的是 socket 对象,而不是简单维护 “端口 → 进程” 的关系。
Unix Domain Socket(本地套接字)
在 Linux 操作系统中,有种文件叫作 Unix Domain Socket (简称 socket) 的文件,Unix Domain Socket 是 Linux 提供的一种基于 socket 接口的本机进程间通信机制。。
假设 A 进程 和 B 进程通过 TCP/IP 协议栈通信,经过内核中的 TCP/IP 协议栈处理,包括传输层的协议控制(如三次握手、ACK 确认等)以及网络层的路由处理等,这些都会引入额外的协议开销。
直接通过 socket 文件通信时,因为没有协议开销,还有不涉及到数据的封装、解封装等,所以性能会更好。
浙公网安备 33010602011771号