万普插件库

jQuery插件大全与特效教程

Web开发相关工作必须理解Http及Tcp的基础原理

从事Java Web开发多年,接触过很多不同的Web项目,所以说一直与Http及Tcp,这些看不见摸不着的玩意打交道。从开始的一知半解,到现在的个人理解,获得一些浅薄经验。写这篇内容,也是自己在加深对网络通信的 一个学习,同时,希望能够给予想从事Web开发工作的同学一些帮助,能看到的话希望能起到一个提醒。

本篇内容不会长篇大论,旨在理解它是什么,在请求中的是如何发挥作用,帮我们传输入数据,实现通信的。要想系统学习,还需通过纸质书籍反复阅读。

HTTP(HyperText Transfer Protocol,超文本传输协议)与TCP(Transmission Control Protocol,传输控制协议)在计算机网络体系结构中分别位于不同的层次,各自承担着不同的功能和角色。



一、HTTP分层介绍

HTTP协议位于应用层,是万维网(WWW)的数据通信基础。HTTP协议的主要作用是在客户端(如Web浏览器)和服务器之间传输超文本内容,包括HTML文档、图片、视频等。HTTP协议的主要特点包括:

  • 无状态:HTTP协议本身不对请求和响应之间的通信状态进行保存。
  • 无连接:HTTP协议默认每次连接只处理一个请求,处理完毕后就会断开连接。但HTTP/1.1版本支持持久连接(Keep-Alive),允许在单个连接上进行多个请求和响应。

HTTP协议格式包括请求行、请求头和请求正文(可选)。请求行包含请求方法(如GET、POST)、URL和HTTP协议版本。请求头包含关于客户端环境的信息,如User-Agent。请求正文用于发送数据到服务器,对于POST方法来说,数据通常放在请求正文中。

二、TCP分层介绍

TCP协议位于传输层,是面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议的主要作用是在两台计算机之间提供可靠的数据传输服务。TCP协议通过以下机制来保证数据的可靠传输:

  • 流量控制:确保数据不会过快地发送,避免拥塞。
  • 拥塞控制:当网络出现拥塞时,减少数据的发送速率。
  • 差错校验:检测并重传损坏的数据包。

TCP协议通过三次握手来建立连接,通过四次挥手来断开连接。三次握手过程包括客户端发送SYN包请求建立连接,服务器回复SYN+ACK包表示同意建立连接,客户端再回复ACK包确认连接建立。四次挥手过程则用于断开连接,确保双方都没有数据需要发送。

三、HTTP与TCP的关系

HTTP协议是构建在TCP协议之上的应用层协议。当在浏览器中输入一个网址时,浏览器会首先通过DNS解析将网址转换为IP地址,然后基于TCP协议与服务器建立连接,最后通过HTTP协议发送请求并接收响应。HTTP协议依赖于TCP协议的可靠性来保证数据的正确传输。几乎所有的 HTTP 通信都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。客户端应用程序可以打开一条 TCP/IP 连 接,连接到可能运行在世界任何地方的服务器应用程序。

四、浏览器请求服务器过程

先复习一下,浏览器输入一个URL,向服务器发起请求,开始到结束这中间经过的步骤过程:


详细过程:

1、用户输入URL后,浏览器首先会解析这个URL,提取出协议(如http、https)、主机名(域名)、端口号(默认为80或443)、资源路径等信息。

2、浏览器通过DNS系统解析主机名对应的IP地址。这个过程中,浏览器会按照以下顺序进行查询:

  • 本地DNS缓存:首先查看本地是否缓存了该域名的IP地址。
  • 操作系统hosts文件:如果本地缓存中没有,浏览器会查询操作系统的hosts文件。
  • 系统缓存:接着会查询系统缓存中的DNS记录。
  • 路由器缓存:如果系统缓存中没有,浏览器会向路由器请求,查看路由器缓存。
  • ISP DNS服务器:如果以上都未找到,最终请求会被发送到互联网服务提供商(ISP)的DNS服务器进行查询。
  • 递归查询:如果ISP DNS服务器也没有找到对应记录,则会进行递归查询,即向根DNS服务器、顶级域名服务器等逐步查询,直到找到对应的IP地址。

3、获得IP地址后,浏览器会基于TCP协议与服务器建立连接。如果使用的是HTTPS协议,还会进行SSL/TLS握手,建立加密通道。

  • TCP连接通过三次握手过程建立,确保通信的可靠性。

4、TCP连接建立成功后,浏览器会构建HTTP请求报文,包括请求行(指定请求方法、URL路径和协议版本)、请求头(包含请求的其他信息,如User-Agent、Cookie等)和请求体(如POST请求中的表单数据)。浏览器将HTTP请求报文发送到服务器。

5、

  • 服务器接收到HTTP请求后,会根据请求报文中的信息进行相应的处理。这可能包括查询数据库、调用内部服务或第三方API、读取文件系统的静态资源等。
  • 服务器处理完请求后,会生成HTTP响应报文,包括状态码(如200表示成功)、响应头(如Content-Type、Content-Length等)和响应体(如HTML页面内容、图片数据等)。

6、浏览器接收到HTTP响应报文后,会进行报文解析,并根据响应内容类型进行渲染。

  • 如果响应是一个HTML页面,浏览器会解析页面的结构和样式,加载CSS和JavaScript文件,最终渲染成用户可以看到的页面。
  • 如果响应是其他类型的资源(如图片、视频等),浏览器则进行相应的处理,如显示图片、播放视频等。

7、一旦页面加载完成,浏览器与服务器之间的TCP连接通常会通过四次挥手过程断开。但如果页面中存在异步请求(如Ajax请求),则可能会保持TCP连接以便继续发送请求和接收响应。


通过以上可以清楚的知道了Http整个的通信过程,下面是再熟悉一下计算机网络的分层模型:这两种模型分别是TCP/IP四层模型和OSI七层模型,它们为网络通信提供了框架和指导。这里不详细说每一层的作用及应用。只是让我们知道与之相关的Http及Tcp在哪一层:


五、接下来要了解并理解掌握的就是Http通信是如何建立连接的?又是如何断开连接的?

HTTP要想通信,只有先建立连接,客户端和服务器才能交互数据;HTTP通信的建立连接和断开连接过程,主要依赖于底层的TCP(传输控制协议)来实现,TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手进行的。

以下为详细说明如图示:



六、 HTTP通信的建立连接(三次握手)的详细过程

HTTP通信建立连接的过程通常被称为“三次握手”,这是一个在客户端和服务器之间建立TCP连接的标准过程。具体步骤如下:

6.1、 第一次握手:

客户端发送一个SYN(同步序列编号)报文给服务器,该报文包含客户端的初始序列号Seq(如2026303352),并请求建立连接。

  • 一开始ClientServer都处于closed状态,先是Server主动监听某个端口,处于LISTEN状态。


  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序列号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

6.2.、第二次握手:

服务器收到客户端的SYN报文后,会以自己的SYN报文作为应答,同时还会将确认序号(Ack)设置为客户端的初始序列号加1(如2026303353),以确认收到客户端的SYN报文。此外,服务器还会发送自己的初始序列号(如324446754)。

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序列号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。


6.3、第三次握手:

客户端收到服务器的SYN+ACK报文后,会向服务器发送一个ACK报文,其确认序号(Ack)为服务器的初始序列号加1(如324446755),以确认收到服务器的SYN报文。此时,TCP连接建立完成,客户端和服务器可以开始传输数据。

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
  • 服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试经常问的问题。一旦完成三次握手,双方都处于 ESTABLISHED 状态,至此,连接就已建立完成,客户端和服务端就可以相互发送数据了。

七、 HTTP通信的断开连接(四次挥手)

HTTP通信断开连接的过程被称为“四次挥手”,用于确保客户端和服务器之间的TCP连接可以被安全地关闭。具体步骤如下:

7.1. 第一次挥手:

- 客户端发送一个FIN(结束)报文给服务器,表示自己已经没有数据要发送了,请求关闭连接。

7.2. 第二次挥手:

- 服务器收到客户端的FIN报文后,会发送一个ACK报文给客户端,其确认序号(Ack)为客户端FIN报文的序列号加1,以确认收到客户端的FIN报文。此时,客户端到服务器的连接被关闭,但服务器到客户端的连接仍然打开。

3. 第三次挥手:

- 服务器在发送完所有待发送的数据后,会向客户端发送一个FIN报文,表示服务器也没有数据要发送了,请求关闭连接。

4. 第四次挥手:

- 客户端收到服务器的FIN报文后,会发送一个ACK报文给服务器,其确认序号(Ack)为服务器FIN报文的序列号加1,以确认收到服务器的FIN报文。此时,TCP连接被完全关闭。

八、为什么是三次握手?不是两次、四次?

TCP 连接:

  • 上述可靠性和流量控制机制要求TCP初始化并维护每个数据流的特定状态信息。这些信息的组合,包括套接字、序列号和窗口大小,称为连接。

所以,关键要理解的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。

三个方面分析三次握手的原因:

  • 三次握手才可以阻止历史重复连接的初始化;(主要原因)
  • 三次握手才可以同步双方的初始序列号;
  • 三次握手才可以避免资源浪费;

原因一

RFC 793 指出的 TCP 连接使用三次握手的首要原因:The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

  • 客户端连续发送多次 SYN 建立连接的报文,在网络拥堵等情况下:一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;那么此时服务端就会回一个 SYN + ACK 报文给客户端;客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接。如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接:如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史连接;如果不是历史连接,则第三次发送的报文是 ACK 报文,通信双方就会成功建立连接;所以, TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。

原因二:同步双方序列号

  • TCP 协议的通信双方,都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:接收方可以去除重复的数据;接收方可以根据数据包的序列号按序接收;可以标识发送出去的数据包中, 哪些是已经被对方收到的;可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
  • 四次握手与三次握手


四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」。而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。

原因三:避免资源浪费

如果只有「两次握手」,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN ,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,这会造成什么情况呢?如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求 SYN 报文,而造成重复分配资源。

小结

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。不使用「两次握手」和「四次握手」的原因:「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

为什么客户端和服务端的初始序列号 ISN 是不相同的?

因为网络中的报文会延迟、会复制重发、也有可能丢失,这样会造成的不同连接之间产生互相影响,所以为了避免互相影响,客户端和服务端的初始序列号是随机且不同的。

初始序列号 ISN 是如何随机产生的?

起始 ISN 是基于时钟的,每 4 毫秒 + 1,转一圈要 4.55 个小时。RFC1948 中提出了一个较好的初始化序列号 ISN 随机生成算法。ISN = M + F (localhost, localport, remotehost, remoteport)M 是一个计时器,这个计时器每隔 4 毫秒加 1。F 是一个 Hash 算法,根据源 IP、目的 IP、源端口、目的端口生成一个随机数值。要保证 Hash 算法不能被外部轻易推算得出,用 MD5 算法是一个比较好的选择。

总结

HTTP通信的建立连接和断开连接过程,实际上是TCP协议的三次握手和四次挥手过程。这些过程确保了网络通信的可靠性和稳定性。在HTTP/1.0中,每次请求/响应都会经历一次完整的连接建立和断开过程(即短连接);而在HTTP/1.1及更高版本中,支持通过连接头部(如`Connection: keep-alive`)来保持连接开启状态,以便进行多次请求/响应,从而提高了通信效率(即长连接)。然而,无论是短连接还是长连接,其底层的TCP连接建立和断开过程都是相同的。

本内容只是简单讲解了Http与Tcp的关系、Http及Tcp处于计算机网络的哪一层、Http是如何通过Tcp建立连接并进行通信、三次握手建立连接、四次挥手断开连接等,虽然是简单讲解,但是完全可以很好的将Http及Tcp的基础原理在脑海中有个清楚印象,减少或避免web日常开发中的懵懂认识,提升开发理解,避免机械式的搬运,有自身理解的开发高性能业务模块。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言