一文读懂客户端请求是如何到达服务器的( 二 )


5、IP
网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对不同子网的数据包进行路由 。IP的主要作用就是在复杂的网络环境中将数据包发给最终的目标地址 。
IP是面向无连接的,是无状态的协议 。IP为什么被设计成无状态呢?
1. 无状态协议处理简单
2. 通信之前无需建立连接
3. TCP已经面向连接服务了,IP层可以委托TCP来解决面向连接的问题
4. 由于不带有状态,互联网路由起来更加自由,容错性也更强
值得注意的是,现实中的IP层往往都带有安全过滤,甚至有些路由器,防火墙等中途设备还会干涉应用(例如通过reset数据包来干涉TCP会话),为了更好的做安全检测,IP层还增加了connection tracking,在无状态协议上面来追踪上层连接 。这种方式提高了安全性,但有时也会带来新的问题,我们后面有案例具体讲述connnection tracking带来的坑的故事 。
6、TCP Socket
应用程序通过TCP socket接口来调用TCP服务,从而达到传递数据的目的 。每一个TCP socket会被绑定到一个端口,TCP socket双向都可以通信,在发送数据的同时,还可以接收数据 。
值得注意的是,应用程序发送完数据,只代表通过TCP socket委托给TCP的工作已经完成,不代表发送给对端完毕,应用发送数据和TCP传输数据不是同步的 。
7、How TCP/IP Works
当用户通过TCP socket接口发送请求后,TCP协议模块接管了请求传递,TCP先把请求拆分成一个个更小的数据分段(假设TCP offload没有开启的情况下),通过IP层发送出去 。在IP层,这些数据分段会被封装成IP数据包,通过数据链路层发送给互联网(见下图) 。这些数据包经过互联网的多个路由器到达目的地 。由于IP网络是无状态的协议,每一个数据包走的路径可能不一样,而且到达的顺序也有可能不一样,这就要求对端的TCP需要重新组装数据包,以确保向应用层传递的数据是用户能够识别的用户请求,这样服务器应用程序就可以处理用户发起的请求了 。

一文读懂客户端请求是如何到达服务器的

文章插图
 
下图中,假设用户请求拆分成两个IP数据包
一文读懂客户端请求是如何到达服务器的

文章插图
 
第一个IP数据包可能经过A,B,C,G,如下图 。
一文读懂客户端请求是如何到达服务器的

文章插图
 
第二个数据包可能经过A,B,E,G(在B点选择了E节点,导致路径不同),如下图 。
一文读懂客户端请求是如何到达服务器的

文章插图
 
导致数据包在B节点走向不同路径的原因可能有很多种,例如C节点暂时不如E节点通畅或者临时发生了网络拥塞,这与在高速道路驾驶的原理差不多 。
由于网络环境多变,还可能第二个数据包先到达服务器,这时TCP会负责处理out of order的情况;如果网络传递过程中,某一个路由器由于过于繁忙,把第一个数据包丢了,那么客户端的TCP会负责重传第一个数据包,确保服务器端的TCP能够不会因为丢包而收不到第一个数据包 。
如果用户请求内容很大,如上传一个大文件,就会被拆分成大量数据分段,而TCP传输这些数据分段的时候,往往还会考虑整个互联网能够接收的程度和对方能够接收的程度,发送数据过于贪婪不仅会连累整个互联网,对方也未必能够接收得了,而且还可能使自己速度更慢,这有点像道路驾驶一样,不能过于自私,遵守一定的交通规则才能使道路通畅 。在互联网传输数据方面,这些交通规则算法就是赫赫有名的网络拥塞控制算法,而对方能否接收得了,则通过发送窗口的方式进行控制 。总体来说,一次发送数据的大小是根据对方的接收窗口大小和拥塞控制算法来综合决定的 。
从上面可以看出,IP负责在互联网传输数据,而TCP负责数据传输可靠并且尽量使网络健康运行,两者合作完成了请求的传递,这也是互联网应用工作的普遍方式 。
需要注意的是,TCP负责跟TCP进行交互,应用层无需去实现TCP的功能,只需要委托给TCP来完成数据传输,这种隔离的方式给应用层的开发/运维/测试带来了方便,另外,当出现TCP相关问题时,解决问题的难度也大大增加 。
8、TCP经验知识
在多年实战过程中,我们发现以下TCP经验对工作很有帮助 。总结如下:
1. 距离越远,延迟越大,重传概率越大
2. 网络状况好坏,直接影响应用程序性能
3. 不同环境,采用不同的拥塞算法


推荐阅读