前面主要是讲述了应用层的浏览器生成消息,查询目标服务器的DNS;本部分我们聚焦操作系统中的协议栈是如何将消息进行处理并发送出去的。
image.png1、软硬件配合将消息从客户端发送出去。
软件:网络控制软件(协议栈)、网卡驱动程序
硬件:网络硬件(网卡)
2、TCP与UDP的一般应用场景?
浏览器、邮件等一般应用程序收发数据时用TCP
DNS查询等收发较短的控制数据时用UDP
IP协议来控制网络包的收发,将网络包发送给通信对象。
ICMP用于告知网络包传送过程产生的错误即各种控制消息。
ARP用于根据IP地址查询相应的以太网MAC地址。
3、套接字的实体啥?
在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,比如通信对象的IP地址,端口号,通信操作进行的状态等。套接字只是一个概念并不存在实体,可以简单将这些控制信息理解成是套接字的实体,或者该存放控制信息的内存空间是套接字实体。
协议栈是根据套接字中记录的控制信息来工作的。
4、套接字内容
windows 下可以使用
netstat -ano 查看套接字的内容。
- a 表示不仅显示正在通信的套接字,还显示显示尚未开始通信状态的套接字
- n 表示显示IP地址和端口号
- o 表示显示使用该套接字的程序PID
状态:
LISTENING: 表示等在对方连接的状态
ESTABLISHED: 表示完成连接并正在进行数据通信的状态。
5、连接操作
- 服务器程序一般在系统启动时,也会创建套接字并等待客户端连接
- 客户端将自己的IP地址和端口号告知服务器
- 客户端把服务器端的IP地址和端口号告诉协议栈。
缓冲区
: 当执行数据收发时,我们还需要一块临时存放收发的数据的内存空间。这个内存空间就是缓冲区。
6、保存控制信息开关至信息的头部
image.png数据包中的头部,除了TCP头部,还有IP和以太网的控制信息。
7、连接操作的实际过程?TCP的三次握手
TCP的三次握手是为了保证通信双发都具备收发数据的能力。
- 在客户端TCP 头部创建好了之后会将信息传递给IP模块,委托它进行发送。
- IP执行网络包发送操作后,网络包通过网络到达服务器端
- 服务器端的TCP模块根据TCP头部中的信息找到对应端口号(Web服务用的是80端口)对应的套接字。
- 套接字写入相应信息,并将状态改为正在连接
详细的三次握手解析:
-
刚开始客户端和服务端均处于Closed状态,由于服务器端在初始化的时候会主动监听某个端口,处于LISTENING状态
-
客户端会初始化一个随机的序列号(client_isn)放置在TCP首部的序号部分,同事将SYN 置位1,把SYN报文发送给服务器端,表示向服务器端发起连接。
3.服务器端收到客户端发来的SYN报文后,也随机初始化自己的序号(server_isn),同样的也写入TCP首部的序号部分中,同时将TCP首部中的确认应答号字段设置为(client_isn+1),同事将SYN和ACK标志位设置为1,最后把该报文发送给客户端
- 客户端收到服务端的报文后,还要再向服务端回复最后一个应答报文,首先将TCP首部中的ACK标志位设置为1,然后在确认应答号中写入(server_isn + 1),最终将该报文发送给服务器。之后客户端处于ESTABLISHED状态。
5.服务区收到客户端的应答报文后,也进入ESTABLISHED状态。
8、收发数据
应用程序将数据发送给协议栈时,协议栈并不是一收到数据就像数据发送出去,而是先将数据放在内部的发送缓冲区,等数据积累到一定量时在发送出去。
至于积累多少取决于一个网络报所能容纳的数据长度和时间。数据发送频率不高的情况下如果每次都等到长度接近MSS是在发送,可能会出现因为等待时间太长而造成发送延迟,这种情况下即时没有达到MSS,也会发送出去,协议栈内部有个计时器,经过一定时间后,就会把网络包发送出去。
监考协议栈控制发送也会有一些问题,因此协议栈给应用程序保留了控制发送时机的余地。像浏览器这种会话型的应用程序在向服务器发送数据时,等待填满缓冲区导致延迟会产生很大影响,一般会直使用直接发送的选项。
- MTU: 一个网络包的最大长度,以太网中一般为1500字节
- MSS: 除去头部之后,一个网络包所能容纳的TCP数据额最大长度
网友评论