目录
2.1.1 协议栈的内部结构
TCP/IP 软件分层结构
协议栈内部包括TCP/UDP/IP,浏览器、邮件等一般应用程序使用 TCP 收发数据,DNS 查询等收发较短的控制数据使用 UDP。
在互联网上传送数据时,数据被分成一个个网络包 , IP 协议负责将网络包发送给通信对象。另外,IP还包括 ICMP 协议和 ARP 协议。
ICMP: 用于告知网络包传送过程中产生的错误以及各种控制消息。
ARP :用于根据 IP 地址查询相应的以太网 MAC 地址 。
接下来,网卡驱动程序负责控制网卡硬件,网卡负责完成实际的收发操作。
2.1.2 套接字的实体就是通信控制信息
协议栈内部有一块内存空间用于存放控制通信操作的控制信息,包括通信对象的 IP 地址、端口号、通信操作的进行状态等。其实可以说,套接字就是这些控制信息。
协议栈在执行操作时需要参阅这些控制信息。例如,数据发出后协议栈需要等待响应信息,但如果数据丢失,不能一直等,而需要经过一段时间后重发,这时候套接字就需要记录是否收到响应以及经过了多长时间。
在 Windows 中可以用netstat 命令显示套接字内容,(Win+R,输入cmd回车,输入netstat回车)
如果加上参数 -ano 还会显示 所有套接字/IP地址和端口号/使用该套接字的程序PID
这里的每一行相当于一个套接字,当然套接字还有一些其他控制信息图中没显示。
另外,状态LISTENING表示等待对方连接,ESTABLISHED表示完成连接并正进行通信。
该行表示正在使用IP地址127.0.0.1的网卡与IP地址为127.0.0.1的对象进行通信,本机使用6000的端口,而对方使用54587的端口。
而第一行这个则表示PID为960的程序正在等对方连接,IP0.0.0.0表示还没开始通信,也就没有绑定IP地址和端口,另外,如果是UDP协议的话,显示 * ,不绑定对方地址和端口。
2.1.3 调用 socket 时的操作
浏览器委托协议栈使用TCP 协议来收发数据。
应用程序调用 socket 申请创建套接字,协议栈执行操作。
协议栈首先会分配用于存放一个套接字所需的内存空间,并写入初始状态的控制信息。接下来,将表示这个套接字的描述符(1.4.2中已介绍,用来区分协议栈中的多个套接字)告知应用程序。
应用程序收到描述符后,向协议栈进行收发数据委托时就需要提供这个描述符。通过描述符确定了相应的套接字,协议栈就能够获取所有的相关信息。
本节完。