美文网首页ios 面试网络
简单描述HTTP连接建立流程

简单描述HTTP连接建立流程

作者: 子鱼_谋 | 来源:发表于2019-06-15 15:06 被阅读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请求过程

    相关文章

      网友评论

        本文标题:简单描述HTTP连接建立流程

        本文链接:https://www.haomeiwen.com/subject/rfcjtctx.html