Http协议

185 阅读7分钟

1.网络协议的分层

  • 应用层:应用层的任务是通过应用进程间的交互来完成特定的网络应用,应用层定义的是应用进程间的通信协议,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。

  • 运输层:应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。

传输层的主要协议

1.传输控制协议-TCP:提供面向连接的,可靠的数据传输服务。

2.用户数据协议-UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输
  • 网络层:选择合适的网间路由和交换结点 (寻路与寻址) ,确保计算机通信的数据及时传送。最重要的是TCP/IP协议

  • 数据链路层: 两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。

2.TCP的三次握手与四次挥手

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。

  • TCP报文的头部结构

  • ACK:确认序号有效。

  • FIN:释放一个连接。

  • SYN:发起一个新连接。

1.1三次握手

三次握手的本质是确认客户端与服务端通信双方收发数据的能力.

  • 第一次握手:客户端请求链接,服务端收到,服务端知道了客户端的发送能力正常,服务端知道了自己的接收能力正常
  • 第二次握手:客户端收到确认回信:客户端收到,客户端知道了自己发送能力与的接收能力正常,但是服务端还不知道自己的发送能力,所以需要第三次握手,服务端检查自己的发送能力是否正常
  • 第三次握手:服务端收到确认回信,客户端子到自己的发送能力正常

详细过程:

  • 第一次握手:客户端要向服务端发起连接请求,首先客户端SYN标志位置为1,表明是一个请求链接的报文,并且生成一个随即序列号seq=x。

  • 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号x存起来,并且随机生成一个服务端的起始序列号y。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=y、确认号ack=小+1(客户端发过来的序列号+1)。

  • 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=x+1,于是知道服务端已经收到了序列号为x的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号y给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=有+1(服务端序列号+1)、seq=x+1,当服务端收到报文后发现ACK=1并且ack=y+1,就知道客户端收到序列号为y的报文了,就这样客户端和服务端通过TCP建立了连接。

1.2四次挥手

四次挥手的目的是在数据传输完成之后关闭一个连接

  • 第一次挥手:客户端已经发送完数据,发送断开链接请求给服务端
  • 第二次挥手:服务端告诉客户端可以断开链接
  • 第三次挥手:服务端发送完数据之后,发送断开链接的请求给客户端
  • 第四次挥手:客户端告诉服务端可以断开链接

详细过程:

  • 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=x(最后发送数据的序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。

-第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=x+1(客户端FIN报文序列号x+1)、序列号seq=y(已接受的序列号)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

  • 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=x+1、序列号seq=y。

  • 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=y+1、序列号seq=x+1。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

3.HTTP报文的组成

3.1请求报文构成

  • 请求行:包括请求方法、URL、协议/版本
  • 请求头(Request Header)
  • 请求正文

3.2响应报文构成

  • 状态行
  • 响应头
  • 响应正文

3.3 HTTPS协议

一般http中存在如下问题:

  • 请求信息明文传输,容易被窃听截取。
  • 数据的完整性未校验,容易被篡改
  • 没有验证对方身份,存在冒充危险

为了解决上述HTTP存在的问题,就用到了HTTPS。 HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

1.首先客户端通过URL访问服务器建立SSL连接。

2.服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。

3.客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

4.客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

5.服务器利用自己的私钥解密出会话密钥。

6.服务器利用会话密钥加密与客户端之间的通信。

与Http的不同点

  • HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。
  • http和https使用连接方式不同,默认端口也不一样,http是80,https是443。