前面几篇文章讲解的是应用程序使用Socket间接通知协议栈进行的连接,通信阶段,那么从现在开始讲解协议栈和网卡驱动的故事
回顾上篇文章,我们从第一阶段创建套接字,协议栈返回描述符讲起~~~
协议栈结构
首先来看下协议栈的大致结构:
应用程序
代表客户端,浏览器,电子邮件等程序,这些程序发出请求委派给下一层的Socket
Socket程序
解析器也是Socket的一部分用于DNS服务查询域名的IP地址,其他部分就是委派操作系统的协议栈去处理数据了
操作系统
操作系统的协议栈分为两部分,上半部分为TCP/UDP协议;下半部分为IP协议;IP协议部分用于接受TCP,UDP的请求进行填充额外控制信息,数据在网络中如果超过一定长度(后面讲解)是需要切割分成一个一个包进行传输的,而IP协议就是用于收发网络包的。在图中还可以看到有ICMP和ARP,ICMP用于表示网络包传输过程中出现的错误,ARP是用于根据IP查询MAC地址(为什么需要MAC地址呢?因为操作系统是委托网卡的,网卡需要知道MCA地址)
驱动程序
网卡驱动程序用于控制网卡,IP协议向网卡驱动程序发送的数字信号接下来会被网卡转换数为电信号在网线中传输。
套接字
协议栈的内部会有一块记录通信对方的ip端口,通信状态,使用这块内存的应用pid的内存空间等,这个内存空间就是套接字存储的内容,这些内容叫做控制信息
协议栈需要根据套接字所存储的控制信息进行下一步的操作。
netstat命令用于查看套接字内容
- proto协议类型tcp或者udp协议
- localaddress “:”前面代表本机使用的ip地址(ip地址本来是网卡才有的,因为计算机内部有很多网卡,所以也就说计算机有很多ip地址);后面代表使用的端口号(根据套接字生成的一个数字)
- foreignaddress:和loacladdress一样的格式,两者都是建立连接后才会显示数字的默认是0
- state是这个套接字的连接状态
- pid:使用这个套接字的应用程序,由于一个应用程序会有很多个网络请求因此也有多个套接字
应用程序通过socket向协议栈发起创建套接字的请求时,协议栈会创建出一块内存并写入这个套接字刚创建完成的初始化状态,并将代表这个套接字的描述符返回给应用程序。
原文链接:协议栈——创建套接字 - 掘金 (juejin.cn)