ios 面试网络

简单描述HTTP连接建立流程

2019-06-15  本文已影响0人  子鱼_谋

连接建立流程步骤如下:


HTTP连接流程

第1步:TCP通过三次握手建立双方连接;
第2步:客户端通过发送请求报文及请求数据给服务端;
第3步:服务端返回响应报文及响应数据给客户端;
第4步:TCP通过四次挥手进行断开连接。

TCP连接(三次握手)

TCP连接就是我们熟悉的三次握手过程

第一次握手:客户端通过标志位发送SYN = j 给服务端,表面客户端想要建立连接,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务端收到SYN标志后返回ACK =(j+1) 应答标志给客户端,同时自己也发送一个SYN包(syn=k),表面可以建立连接,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务端端SYN+ACK应答标志后回传ACK =(k+1)标志给服务端,说明自己已经收到了ACK标志,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

为什么会有三次握手而不是两次握手呢?

因为TCP有超时重连机制,

HTTP请求报文:

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

请求报文
1.请求行
请求行分为三个部分:请求方法、请求地址和协议版本。

请求方法:HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。

最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

请求地址:URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。

组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略(HTTP默认端口号是80)

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

2.请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

3.实体主体
实体主体即请求数据,不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

HTTP响应报文

HTTP响应也由三个部分组成,分别是:状态行、响应头部、响应正文(实体主体)。


image.png

其中,版本(HTTP-Version)表示服务器HTTP协议的版本;状态码(Status-Code)表示服务器发回的响应状态代码;短语(Reason-Phrase)表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

状态码对应的含义:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。

响应头部与相应正文则与请求头部及请求数据向对应。

TCP关闭连接(四次挥手)

但服务端与客户端的数据传输完毕后,需要通知对方断开连接,就有了现在的四次挥手过程:

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为什么要四次分手

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

参考资料:一次完整的HTTP请求过程

上一篇下一篇

猜你喜欢

热点阅读