1、协议栈的内部结构:
协议栈作为操作系统中的网络控制软件我们在表面上是看不见的,所以接下来先对协议栈做个解剖。我们使用TCP/IP分层进行解析:
从上图中可以看出,协议栈内部分为好几个部分,分别承担着不同的功能。例如协议栈上半部分的两块,分别负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分。像浏览器、邮件等一般的应用程序都是使用TCP收发数据,而像DNS查询等收发较短的控制数据时候则使用UDP。下半部分的IP协议控制网络收发操作的部分。此外,IP中的ICMP协议用来告知网络包传递过程中产生的错误以及各种控制消息,IP中的ARP协议用来根据IP地址查询相应的以太网MAC地址(符合IEEE规格的局域网设备都使用同一格式的地址)。
2、套接字的实体就是通信控制信息:
前面文章中提到的套接字其实就是协议栈内部一块用于存放控制信息的内存空间,一般记录了用于控制通信操作的控制信息,例如通信对象IP地址、端口号、通信操作的进行状态等。协议栈在执行操作时就需要参阅这些控制信息,用于判断下一步的行动。下图就是Windows中使用netstat命令显示的套接字内容(a表示不仅显示正在通信的套接字,还包括尚未开始通信等状态的所有套接字;n表示显示IP地址和端口号;o表示显示使用该套接字的程序PID):
从左向右分析每一列
协议:协议类型,使用TCP/IP协议通信的情况下会显示TCP或UDP
本地地址:运行netstat命令的计算机本身(本地端)的IP地址和端口号,当有多块网卡时就会显示多个IP地址。0.0.0.0表示不绑定IP地址,127.0.0.1表示本机。
外部地址:通信对象(远程端)的IP地址和端口号。0.0.0.0表示还没有开始通信,没有绑定IP地址和端口号,此外,UDP协议中的套接字不绑定对方的地址和端口,因此会显示*.*。
状态:表示通信状态,LISTENING等待对方连接的状态,ESTABLISHED完成连接并正在进行数据通信的状态表。
PID:使用该套接字的程序PID(Process ID 进程标识符)。可以使用任务管理器来查询PID对应的进程名称,不过任务管理器默认不显示PID,需要在“查看”——>“选择列”中设置显示PID。
那么这些信息整体上该如何解读呢?比如第一行表示PID为404的程序正在135端口等待另一方的连接,其中本地IP地址和外部IP地址都为0.0.0.0,这表示通信还没有开始,IP地址不确认。
3、调用socket时的操作:
接下来使用一张图来表示浏览器调用Socket库中的不同组件委托协议栈使用TCP协议来收发数据的过程:
特别声明:《网络是怎样连接的》读后感