Fork me on GitHub

HTTP协议原理以及实践

HTTP协议基础

HTTP协议是再应用层上,构建于TCP协议之上。

参考资料

TCP(传输控制协议)

传输控制协议(TCP)是一个面向连接的协议,它保证了两台计算机之间数据的可靠性和顺序。换句话说,TCP是一种传输层协议,它可以让你将数据从一台计算机有序地传输到另一台计算机。正式由于这些特点,HTTP协议都是基于TCP协议的。

HTTP发展历史

HTTP/0.9

  • 只有一个命令GET
  • 没有HEADER等描述数据的信息
  • 服务器发送完毕,就关闭TCP连接,一个TCP连接只有一次http请求

HTTP/1.0

  • 增加了很多命令(比如POST、PUT等)
  • 增加status code(描述服务端处理某一个请求之后的状态)和header(对请求的数据的描述和对数据操作的方法)
  • 多字符集支持、多部分发送、权限、缓存
  • 一个http请求还是要创建一个tcp连接,服务端返回完内容之后,tcp连接会关闭掉

HTTP/1.1

  • 持久连接(一个tcp连接对应多个http请求)
  • 服务端对请求的处理的串行的
  • 增加host(一台物理服务器可以开启多个web服务)

HTTP2

  • 所有的数据以二进制进行传输(以前是字符串)
  • 同一个连接里面发送多个请求不再需要按照顺序来
  • 头信息压缩以及推送(服务端可以主动发起数据传输:比如服务器主动传输css文件和js文件)等提高效率的功能

三次握手

在tcp连接的创建过程中有三次握手的消耗,代表有三次网络传输(客户端发送一次、服务端返回一次、然后客户端再发送一次),tcp连接创建完成之后,才能有我们的HTTP请求。

参考资料

我用node写的一个基于TCP协议的聊天程序

  • 第一次握手(SYN=1, seq=x):

客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

发送完毕后,客户端进入 SYN_SEND 状态。

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

  • 第三次握手(ACK=1,ACKnum=y+1)

客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

示意图

  • 进行三次握手的原因:为了防止服务端开启一些无用的tcp连接。网络传输有延时的,服务端接收到来自客户端的一个创建连接是请求,如果服务端直接创建了这个连接并且把相对应的内容返回给客户端,但是返回的这个数据包因为网络传输的原因丢失了,那么客户端就一直没有接收到服务器返回的数据,客户端可能会因为设置了请求超时设置,就会关闭这个连接再重新创建新的连接请求,但是如果没有三次握手的话,服务端不知道客户端到底也没有接收到返回的信息,这个端口就会一直开着等待客户端来发送请求,服务端的这个端口的开销就浪费了。所以我们需要三次握手让客户端和服务端能够及时地察觉到因为网络原因导致数据包没有收到,可以规避因为网络原因导致的服务器额外开销的问题,达到可靠性的要求。
undefined