一文读懂客户端请求是如何到达服务器的(干货)(2)
当用户通过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. 不同环境,采用不同的拥塞算法 4. 拥塞控制算法是互联网的精华,是互联网大获成功的关键因素之一 5. TCP是有状态协议,采用异步处理 6. 抓包分析是找到TCP相关问题根本原因的利器 7. TCP客户端和TCP服务器端之间的交互,是应用层所有应用公共的交互部分,理解了这部分原理,可以解决大量TCP相关问题。 9、IP经验知识 在IP经验知识方面,我们大致总结如下: 1. 数据包选择路径不是固定的,到达的顺序也可能是乱序的 2. 安全过滤,坑多的地方 3. 无状态协议,简化互联网架构,是互联网大获成功的关键因素之一 4. IP层对TCP传递过来的数据包很少分片处理 5. 中途设备不仅仅具备路由功能,而且还会干涉TCP会话(灵异问题的温床) 10、结束语 TCP/IP网络是互联网的基石,了解TCP/IP是如何工作的,对于我们解决问题是非常有帮助的。
(编辑:ASP站长网) |