目录
浏览器、邮件等一般应用程序收发数据时用 TCP; 网络包:网络中的数据会被切分成几十字节到几千字节的小块,每一个小数据块被称为一个包 IP 中还包括 ICMPA 协议和 ARPB 协议。 IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作 在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的 IP 地址、端口号、通信操作的进行状态等。本来套接字就只是一个概念而已,并不存在实体,如果一定要赋予它一个实体,我们可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体 协议栈是根据套接字中记录的控制信息来工作的 创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态 以太网头部又称“MAC 头部” 通信操作中使用的控制信息分为两类。 连接操作的第一步是在 TCP 模块处创建表示连接控制信息的头部。 MTU:一个网络包的最大长度,以太网中一般为 1500 字节。 MTU:Maximum Transmission Unit,最大传输单元 MSS:Maximum Segment Size,最大分段大小。 TCP 和 IP 的头部加起来一般是 40 字节,因此 MTU 减去这个长度就是 MSS。例如,在以太网中,MTU 为 1500,因此 MSS 就 是 1460。TCP/IP 可以使用一些可选参数 img1 img2 应用程序的数据一般都比较大,因此 TCP 会按照网络包的大小对数据进行拆分 IP 模块会在网络包前面添加 IP 头部和以太网的 MAC 头部后发送网络包 img3 我们在前面讲连接操作的时候说过 SYN 为 1 表示进行连接,这是因为将SYN 设为 1 并告知初始序号这一操作仅在连接过程中出现,因此发送SYN 为 1 的网络包就表示发起连接的意思。实际上,SYN 是 Synchronize(同步)的缩写,意思是通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查,这才是 SYN 原本的含义 img4 序号和 ACK 号的交互 网卡、集线器、路由器都没有错误补偿机制,一旦检测到错误就直接丢弃相应的包。应用程序也是一样,因为采用 TCP 传输,即便发生一些错误对方最终也能够收到正确的数据,所以应用程序只管自顾自地发送这些数据就好了 不过,如果发生网络中断、服务器宕机等问题,那么无论 TCP 怎样重传都不管用。这种情况下,无论如何尝试都是徒劳,因此 TCP 会在尝试几次重传无效之后强制结束通信,并向应用程序报错 通过“序号”和“ACK 号”可以确认接收方是否收到了网络包 所谓滑动窗口,就是在发送一个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包。这样一来,等待 ACK 号的这段时间就被有效利用起来了 img5 img6 滑动窗口与接收缓冲区
1 创建套接字
DNS 查询等收发较短的控制数据时用 UDP
2 连接服务器
通过 TCP 头部中的发送方和接收方端口号可以找到要连接的套接字
3 收发数据
MSS:除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度
(protocol option),如加密等,这时头部的长度会增加,那么 MSS 就会随着头部长度增加而相应缩短