您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

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

时间:2019-08-19 10:54:45  来源:  作者:

互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCP/IP协议。那么TCP/IP是如何工作的呢,我们先从数据包开始讲起。

1、数据包

一、HTTP请求和响应步骤

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

 

http请求全过程

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

 

请求

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

 

响应

以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。

2、TCP/IP概述

我们以RFC 1180中的图作为参考

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

 

上图展示了四层TCP/IP协议图,其中network Applications是应用程序,属于应用层;TCP和UDP主要是传输数据,属于传输层,TCP确保端对端的可靠传输并尽量确保网络健康运行,而UDP是简单不可靠传输;IP主要解决路由问题,属于网络层;ARP是网络地址转换,主要用来转换IP地址和mac地址,介于数据链路层和网络层之间,可以看成2.5层;ENET在这里是数据链路层,网卡驱动属于这一层,主要做具体的介质传输,前面示例中的广告请求抓包就是在数据链路层抓取。

值得注意的是,ARP在linux系统里属于网络层,而在RFC里是介于数据链路层和网络层之间。在《TCP/IP详解》一书里,ARP被放到了数据链路层。当解决实际问题的时候,我们应该把ARP放到网络层。

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

 

上图给出使用TCPCopy在不同层发包的使用方法。如果TCPCopy从数据链路层发包,由于没有享受到ARP服务,用户需要在使用TCPCopy的时候额外加上MAC地址;而如果TCPCopy从IP层发包,则无需指定MAC地址。

本课程主要讲述TCP相关案例,没有特殊说明的话,TCP特指传输层的TCP。

3、什么是TCP

TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。TCP的主要工作是定义端口标识应用程序的身份,实现端对端的可靠通信,并进行拥塞控制,防止互联网崩塌。

TCP有如下关键特性:

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

 

由于TCP是面向连接的协议,所以是一种有状态的协议,而有状态的协议往往比较复杂,因此TCP学习起来也比较困难。

通过状态图来查看一下TCP状态的复杂性:

 

上图展示了错综复杂的TCP状态图,然而现实更加复杂。

现实中的TCP状态图其实是这样的:

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

 

图中,不仅SYN_RCVD状态能够收到reset数据包(图中RST,reset数据包是重置连接的数据包,可以使TCP状态瞬间变为CLOSED状态,而CLOSED状态是无法追踪的),而且FIN_WAIT1、FIN_WAIT2、ESTABLISHED、SYN_SENT和CLOSE_WAIT都能被reset数据包打回到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层往往都带有安全过滤,甚至有些路由器,防火墙等中途设备还会干涉应用(例如通过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. 不同环境,采用不同的拥塞算法

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是如何工作的,对于我们解决问题是非常有帮助的。



Tags:服务器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  Tags: 服务器  点击:(6)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  Tags: 服务器  点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  Tags: 服务器  点击:(16)  评论:(0)  加入收藏
简介在之前的文章中,我们提到了在netty的客户端通过使用Http2FrameCodec和Http2MultiplexHandler可以支持多路复用,也就是说在一个连接的channel基础上创建多个子channel,通过...【详细内容】
2021-12-14  Tags: 服务器  点击:(8)  评论:(0)  加入收藏
阿里云和腾讯云都是非常好的云服务器平台,大多数用户完全不用纠结腾讯云还是阿里云,特别是微信开发用户,自然是首选腾讯云,其次是学生或个人以及财政紧张的小公司微型业务,腾讯云...【详细内容】
2021-12-14  Tags: 服务器  点击:(14)  评论:(0)  加入收藏
今日总监说32 服务器 磁盘占用率 超过80%多了 。不对啊 之前才清理过df -h 查看了一番 果然40g 用了33g。看了下历史会爆目录 也就5.3G 之前是服务生成临时下载的附件多。...【详细内容】
2021-12-10  Tags: 服务器  点击:(17)  评论:(0)  加入收藏
在Linux系统下如何分享文件呢,你可能会想到用scp、rsync此类的命令,但都需要给出服务器密码,不安全。或者搭建一个ftp、nfs或samba的服务,分配个账号或划分个权限给其它人共享文...【详细内容】
2021-12-08  Tags: 服务器  点击:(17)  评论:(0)  加入收藏
域名系统是最重要的互联网服务之一,没有它,我们将无法访问在线内容,甚至无法发送电子邮件。每当我们尝试连接到其他网站或在线服务时,根 DNS 服务器都会帮助我们的计算机找到并...【详细内容】
2021-11-25  Tags: 服务器  点击:(35)  评论:(0)  加入收藏
实验拓扑 图 1-1实验需求 在深圳总部的 AF 上,配置 DDOS 防护,防止服务器区的服务器被 DDOS 攻击 在深圳总部的 AF 上,配置 IPS,对服务器区的服务器实现入侵检测和入侵防御实验...【详细内容】
2021-11-23  Tags: 服务器  点击:(26)  评论:(0)  加入收藏
服务器日志(server log)是一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表简单来说,服务器的日记就是记录网站被访问的全过程,什么时间到什么时间有哪...【详细内容】
2021-11-11  Tags: 服务器  点击:(42)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条