转载:https://void-star.icu/archives/601
网络栈从定义上还比较抽象。不过从功能上看,它是为了让主机之间交换数据而生的。
要实现网络栈,最原始的一个方式就是:将想发送的报文封装成帧,然后发出去就完事了。接收主机会按约定好的方式解析。不过这种存在一个问题,如果要加密怎么办?要支持QoS怎么办?要支持路由怎么办?这可坏了,所有的主机都得修改解析方式。所以,网络栈有个最基本的要求,就是可扩展。随之而来,数据包的格式也得可扩展。这就有了协议栈这种东西,各种协议报头是一层层叠加在数据之上的。对某个协议做修改,可以尽量不影响到其他的协议。
1.2. 各层次到底是什么?
接下来说说各层次到底对应于系统中的哪些函数或代码。
应用层对应于socket的一系列接口函数,比如socket、bind、listen等等,它们通常是库函数提供的,封装了系统调用,仍在内核之外。
表示层和会话层未单独实现,但是Linux中的BSD Socket层(net/socket.c
)和INET Socket层(net/ipv4/af_inet.c
)有实现这些功能。
传输层可就太经典了。TCP、UDP自不必多说,而ICMP、IGMP等网络层协议出于实现的方便考虑,也做在了这一层。
网络层包含路由功能,也是网络栈的重要组成部分。它还包括RAW套接字、SOCK_PACKET套接字等。没有包含ARP协议,不过都是怎么方便怎么来,理论上的定义不必深究。
链路层是网络栈和底层驱动的接口层,通常更关心数据帧是如何封装的。
再往下就是驱动层次,它已经离开了网络栈,来到drivers
子目录下的设备驱动程序。
所以,Linux网络栈就包含BSD和INET Socket层、传输层、网络层和链路层。
标签:协议,socket,简介,网络层,网络,内核,Linux,Socket From: https://www.cnblogs.com/ycjstudy/p/18088072