浏览器到服务器的请求响应过程

从我们在浏览器的地址栏输入域名到浏览器显示内容,这个过程发生了什么?

  1. 域名解析:首先去DNS服务器去将域名解析成对应的IP地址。https://blog.csdn.net/yexudengzhidao/article/details/99741269
  2. 再将解析得到的IP地址去我们想要访问的服务器去请求内容。

下面再对第二步进行详细剖析:

首先要弄明白http、https、TCP、UDP、IP、socket直接的联系和区别:参考如下:

对上面几篇文章重点总结:

  • http是应用层的协议,TCP是传输层的协议,IP是网络层的协议。

  • http主要负责如何包装数据,TCP协议主要解决如何建立连接,如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。 IP协议主要解决网络路由和寻址问题。

  • HTTP协议又称超文本传输协议;是OSI模型中的第七层应用程中协议;具有以下特点:

    1. 支持客户/服务器模式;
    2. 简单快速;
    3. 灵活;
    4. 无连接;
    5. 无状态

对于无连接的理解
      无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
那么,长连接和短连接又是指什么呢??
TCP 提供一种面向连接的、可靠的字节流服务。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
长连接和短连接:
      在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
      而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

对于无状态的理解
      无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。

      由于http是无状态的,所有就有了cookie和session的作用。
      Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了。
      与 Cookie 相对的一个解决方案是 Session,它是通过服务器来保持状态的。

有了上面的基础,我们再来聊一下3次握手,4次分手的过程
TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:

  • SYN(synchronous) 表示建立连接,
  • FIN(finish) 表示关闭连接,
  • ACK(acknowledgement) 表示响应,
  • PSH(push) 表示有 DATA数据传输,
  • RST(reset重置) 表示连接重置。
  • URG(urgent紧急)

Sequence number(顺序号码)
Acknowledge number(确认号码)

所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

SYN 是请求连接的信号,发送连接的时候附带一个序列号seq=x。这个序列号的作用就是当服务端回复给客户端的时候,客户端来判断是不是服务端回复给我的(是不是在我的序列号上进行了+1的操作,即seq=x+1 )

  • 第一次握手(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 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

  • 第一次挥手(FIN=1,seq=x)

    假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

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

  • 第二次挥手(ACK=1,ACKnum=x+1)

    服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

    发送完毕后,服务器端进入CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

  • 第三次挥手(FIN=1,seq=y)

    服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

    发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  • 第四次挥手(ACK=1,ACKnum=y+1)

    客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

    服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。
    客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED状态。

四次挥手的示意图如下:
在这里插入图片描述

SSL握手

开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake),握手阶段分成五步:

  • 客户端给出协议版本号、一个客户端生成的 随机数(Client random),以及客户端支持的加密方法。

  • 服务器确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。

  • 客户端确认数字证书有效,然后生成一个新的 随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务器。

  • 服务器使用自己的私钥,获取客户端发来的随机数(即Premaster secret)。

  • 客户端和服务器根据约定的加密方法,使用前面的三个随机数,生成 对话密钥(session key),用来加密接下来的整个对话过程。

HTTP和HTTPS的区别?

  • HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
  • HTTP 是不安全的,而 HTTPS 是安全的
  • HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
  • 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
  • HTTP 无法加密,而HTTPS 对传输的数据进行加密
  • HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书

https协议的工作原理

客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤:

  • 客户使用https url访问服务器,则要求web 服务器建立ssl链接。

  • web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。

  • 客户端和web服务器端开始协商SSL链接的安全等级,也就是加密等级。

  • 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。

  • web服务器通过自己的私钥解密出会话密钥。

  • web服务器通过会话密钥加密与客户端之间的通信。

发布了398 篇原创文章 · 获赞 182 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/yexudengzhidao/article/details/90371034