加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-08-21 06:16:30 所属栏目:优化 来源:架构师之路
导读:互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCP/IP协议。那么TCP/IP是如何工作的呢,我们先从数据包开始讲起。 1、数据包 一、HTTP请求和响应步骤 http请求全过程 请求 响应 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/I
副标题[/!--empirenews.page--]

互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于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

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读