当前位置: 首页 > 科技观察

一篇了解客户端请求如何到达服务器的文章

时间:2023-03-20 01:20:16 科技观察

互联网是人类历史上最伟大的发明之一,互联网架构的核心在于TCP/IP协议。那么TCP/IP是如何工作的呢?让我们从数据包开始。一、数据包1、HTTP请求和响应步骤http请求请求响应的全过程以上完整的表达了HTTP请求和响应的7个步骤。下面我们从TCP/IP协议模型的角度来理解HTTP请求和响应是如何传输的。2.TCP/IP概述我们使用RFC1180中的图表作为参考。上图为四层TCP/IP协议图,其中网络应用为应用,属于应用层;TCP和UDP主要传输数据,属于传输层。TCP保证端到端的可靠传输,尽量保证网络的健康运行,而UDP是简单的不可靠传输;IP主要解决路由问题,属于网络层;ARP即网络地址转换,主要用于IP地址和MAC地址的转换。在数据链路层和网络层之间,可视为2.5层;ENET在这里是数据链路层,网卡驱动属于这一层,主要是针对特定的媒体传输。前面例子中的广告请求抓包是在数据链路层抓包。值得注意的是,ARP在Linux系统中属于网络层,而在RFC中它介于数据链路层和网络层之间。在《TCP/IP详解》一书中,ARP是放在数据链路层的。在解决实际问题时,应该把ARP放在网络层。上图显示了如何使用TCPCopy在不同层发送数据包。如果TCPCopy从数据链路层发送数据包,用户在使用TCPCopy时需要添加MAC地址,因为他们不享受ARP服务;如果TCPCopy从IP层发送数据包,则不需要指定MAC地址。本课程主要讲TCP相关的案例。如无特别说明,TCP均指传输层的TCP。3.什么是TCP?TCP即TransmissionControlProtocol,它是一种面向连接的、可靠的、基于字节流的通信协议。TCP的主要工作是定义端口的标识以识别应用程序,实现端到端的可靠通信,并进行拥塞控制以防止互联网崩溃。TCP有以下几个主要特点:由于TCP是面向连接的协议,是有状态的协议,而有状态的协议往往比较复杂,所以学习TCP比较困难。通过状态图看一下TCP状态的复杂程度:上图展示了错综复杂的TCP状态图,但实际情况要复杂得多。现实中的TCP状态图其实是这样的:图中不仅SYN_RCVD状态能收到reset包(图中的RST,reset包是重置连接的数据包,可以让TCP状态瞬间变为CLOSED状态,且无法跟踪CLOSED状态),而FIN_WAIT1、FIN_WAIT2、ESTABLISHED、SYN_SENT、CLOSE_WAIT都可以通过复位包返回到CLOSED状态。不仅如此,TCP状态也会受到超时的影响。例如在Linux系统中,一旦连接处于FIN_WAIT_2,如果在60秒内(默认)没有收到对端的FIN数据包,系统会直接将连接状态FIN_WAIT_2变为CLOSED状态。虽然Linux这样做是为了防止攻击,但是这种在超时后杀死连接状态的方法很可能会误杀掉很多正常的连接,使问题更加不可预测。在互联网领域,很多奇葩问题都与TCP状态有关,课程中也会有更多的案例来描述这些奇葩问题。4.端口当我们连接服务器程序时,我们需要指定服务器端口。为什么需要端口?因为系统通过端口来区分不同的应用,而TCP是通过端口来寻找上层应用的。需要注意的是端口号是有限制的,最大端口号是65535,可以使用的端口数取决于配置。比如在压测过程中,限制一台机器可以使用的TCP端口,限制可以使用的连接(客户端端口,客户端IP,服务器应用端口,服务器IP地址)。为了解决这个问题,可以配置多个IP地址来扩大可用连接数。系统支持同一个端口,不同的IP地址绑定不同的应用。在Linux的高版本系统下,在绑定相同IP地址的情况下,我们还可以使用REUSEPORT机制,让不同的应用程序共享同一个监听端口,这对于高性能服务器开发非常有用。我们开发的数据库中间件cetus就是利用这种机制来解决短链接风暴的问题。5、IP网络层的主要工作是定义网络地址,区分网段,子网内的MAC寻址,路由不同子网的数据包。IP的主要功能是在复杂的网络环境中将数据包发送到最终目的地址。IP是无连接且无状态的协议。为什么IP要设计成无状态的?1.无状态协议好办2.通信前不需要建立连接3.TCP已经提供了面向连接的服务,IP层可以委托TCP解决面向连接的问题4.既然有无状态,互联网路由更自由,容错性也更强。值得注意的是,在现实中,IP层往往有安全过滤器,甚至一些中间设备如路由器、防火墙等也会干扰应用程序(如通过复位包干扰TCP)。session),为了更好的进行安全检测,IP层还增加了连接跟踪,在无状态协议上跟踪上层连接。这种方式提高了安全性,但有时也会带来新的问题。后面我们会有一个案例来讲述connnectiontracking带来的坑。6、TCPSocket应用程序通过TCPsocket接口调用TCP服务,从而达到传输数据的目的。每个TCP套接字都会绑定一个端口,TCP套接字可以双向通信,可以在发送数据的同时接收数据。值得注意的是,应用程序发送完数据后,只是意味着完成了通过TCP套接字委托给TCP的工作,并不意味着向对端发送完成。应用程序发送的数据和TCP传输的数据不同步。7.TCP/IP的工作原理当用户通过TCPsocket接口发送请求时,TCP协议模块接管请求传输,TCP首先将请求拆分成更小的数据段(假设未启用TCP卸载),发送通过IP层出来。在IP层,这些数据段被封装成IP数据包,通过数据链路层发送到Internet(见下图)。这些数据包通过Internet中的多个路由器到达目的地。由于IP网络是无状态协议,每个数据包的路径可能不同,到达的顺序也可能不同,这就需要对端TCP重新组装数据包,以保证传输到应用层的数据是正确的用户可以识别的用户请求,以便服务器应用程序可以处理用户发起的请求。在下图中,假设用户请求被拆分成两个IP数据包。第一个IP包可能会经过A、B、C、G,如下图所示。第二个数据包可能会经过A、B、E、G(B点选择节点E,导致路径不同),如下图所示。数据包在B节点走不同路径的原因可能有很多,比如C节点暂时不如E节点顺畅,或者出现暂时的网络拥塞,这类似于在高速公路上行驶的原理。由于网络环境多变,也有可能是第二个数据包先到达服务器,此时TCP会负责处理乱序情况;如果在网络传输过程中路由器太忙,导致第一个数据包丢失,那么客户端的TCP会负责重传第一个数据包,以保证服务端的TCP不会因为包丢失而无法接收到第一个数据包损失。如果用户请求的内容比较大,比如上传一个大文件,就会被拆分成大量的数据段,而TCP在传输这些数据段的时候,往往会考虑到整个互联网能够接收到的程度以及对方能接收到的程度,太贪心发送数据不仅会影响整个互联网,对方不一定能接收到,还可能拖慢你的速度。这有点像在路上开车。你不应该太自私。只有遵守一定的交通规则,道路才能畅通无阻。在互联网上的数据传输方面,这些流量规则算法都是众所周知的网络拥塞控制算法,通过发送窗口来控制对方能否收到。一般来说,一次发送数据的大小是根据对方的接收窗口大小和拥塞控制算法综合决定的。从上面可以看出,IP负责在互联网上传输数据,而TCP则负责可靠的数据传输,让网络尽可能的健康运行。两者合作完成请求的传递,这也是互联网应用常用的工作方式。需要注意的是,TCP负责与TCP交互。应用层不需要实现TCP的功能,只需要委托给TCP完成数据传输即可。这种隔离方式给应用层的开发/运维/测试带来了方便,另外,当出现TCP相关的问题时,解决问题的难度就大大增加了。八、TCP经验知识在多年的实战过程中,我们发现以下TCP经验对我们的工作很有帮助。总结如下:1.距离越远,延迟越大,重传概率越大2.网络质量直接影响应用的性能3.不同环境使用不同的拥塞算法4.拥塞情况控制算法是互联网的精髓。它是互联网取得巨大成功的关键因素之一5.TCP是有状态协议,使用异步处理6.抓包分析是找到TCP相关问题根源的有力工具7.TCP客户端之间的交互而TCPserver是应用层所有应用交互的部分,理解这部分的原理,可以解决大量TCP相关的问题。9、IP经验和知识在IP经验和知识方面,我们大致可以归纳如下:1、数据包的选择路径不固定,到达的顺序也可能乱序2、安全过滤,哪里有很多陷阱3.无状态协议,简化互联网架构是互联网大获成功的关键因素之一。4、IP层很少对TCP传递过来的数据包进行分片。Hotbed)10.结语TCP/IP网络是互联网的基石,了解TCP/IP的工作原理对我们解决问题很有帮助。