全书基于一个简单场景:用户向浏览器输入一条URL到响应返回,一条网络请求的生命周期。
全书分六部分:
- 应用层客户端生成HTTP,委托给操作系统的协议栈
- 协议栈(TCP/IP模块)调用网卡驱动生成电信号
- 网卡如何通过路由器到达用于接入互联网的路由器
- 互联网内部接力传输
- 到达web服务器之后先通过防火墙的检查
- web服务器是如何收取数据的
第二章主要介绍,操作系统中的协议栈和网卡是如何将应用程序的消息发给服务器的:
- 创建套接字
- 连接服务器
- 收发数据
- 从服务器断开连接并删除套接字
- IP与以太网的包收发操作
- 用UDP收发数据的操作
本文介绍1至4,以及TCP模块的整个生命周期。
主要看点如下:
- 协议栈的内部结构
- 套接字的实体是什么?有什么工具能直接观察到吗?
- “连接”的过程中发生了什么?
- 收发数据时的具体工作流程。
- “断开”的过程中发生了什么?
0. 概述
开始探索之前梳理了几个概念:
协议栈的内部结构;
套接字实体
TCP的生命周期
0.1 协议栈的内部结构
所谓协议栈分成上下两部分,
- 接收应用程序委托收发数据的TCP UDP模块。
- 控制网络包发送的IP模块,IP模块包含ICMP协议和ARP协议
- 网卡驱动负责控制网卡硬件,用于监听发送网线中的光电信号
浏览器,邮件等一般应用程序一般用TCP
DNS查询等收发较短的控制数据一般用UDP
0.2 套接字的实体
先用 netstat 直观的感受一下
套接字:协议栈中用于存放控制信息的内存空间
控制信息:协议类型 ip地址 端口号 状态…
套接字中记录了通信双方的信息以及通信所处的状态,
而协议栈是根据套接字中的控制信息来工作的
0.3 TCP 生命周期
一条连接在其生命周期中会经历一系列的状态.
LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED,
FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT,
CLOSED.
CLOSED 是虚拟的一种状态。在状态机上表示连接不存在。
TCB: transmission control block, 通信控制块,即套接字中保存的通信信息
TCP 状态机:
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | |