http协议

想来在下也工作多年,知识亦学亦忘,人生苦短,总该留下点滴,以备所需查找翻阅......

一、基本概念

    HTTP (Hyper Text Transfer Protocol) ,即超文本传输协议,是当下互联网应用最为广泛的一种网络协议;基于TCP/IP,是一种应用层的协议;简而言之,就是实现client端与server端交互的一种统一格式,这也就是为什么叫做协议,即双方要照章办事,才能完成数据的交互成功。  

二、特点

   1.支持客户/服务器模式。

    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。

    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 所以,后来有时还会需要保持这种状态,就出现了咱们所熟悉的 Cookie 和 Session  

            5.1 Cookie : 总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。比如 登陆某系统,可以保持用户在下次访问的时候不必重复输入username 和 password;另一个场合就是应用于购物车,这就是你在某东上看上一部手机,加入了购物车,之后你浏览 百度网页,你会发现弹出的广告怎么都是你之前看上的那部手机。等等吧  
            5.2 Session :session这个概念,其实比较广泛,这里只说 http的session,其代表客户端于服务器端的一次会话,它是通过服务器来保持状态的;  当客户端访问服务器时,服务器根据需求设置 Session,将会话信息保存在服务器上,同时将标示 Session 的 SessionId 传递给客户端浏览器,浏览器将这个 SessionId 保存在内存中,我们称之为无过期时间的 Cookie。浏览器关闭后,这个 Cookie 就会被清掉,它不会存在于用户的 Cookie 临时文件。以后浏览器每次请求都会额外加上这个参数值,服务器会根据这个 SessionId,就能取得客户端的数据信息。如果客户端浏览器意外关闭,服务器保存的 Session 数据不是立即释放,此时数据还会存在,只要我们知道那个 SessionId,就可以继续通过请求获得此 Session 的信息,因为此时后台的 Session 还存在,当然我们可以设置一个 Session 超时时间,一旦超过规定时间没有客户端请求时,服务器就会清除对应 SessionId 的 Session 信息。  

三、状态码

    • 1xx:临时性消息。如:100(继续发送)、101(正在切换协议)

    • 2xx:成功。最典型的的是200(OK)、201(创建成功)

    • 3xx:重定向。如:301(永久移动)302(暂时移动)、304(内容未改变)

    • 4xx:客户端错误。如:400(客户端请求错误)、401(认证失败)、403(被禁止)、404(找不到内容)

    • 5xx:服务器错误。如:500(服务器内部错误)  

四、三次握手

    在TCP/IP协议当中,为了能够提供可靠的连接服务,需要在收发数据之前建立连接,这个连接就是咱们所属的三次握手;
    简单来说就是,保证收发双方,在收数据和发数据之前,准备好资源。  这句话不难理解吧!  

    传输的标示解释:    
    
            SYN(Synchronous 发送方和接收方相互确认序号,表示连接操作 ,建立联机)
            Seq(Sequence number 顺序号码)
            ACK(Acknowledge ACK控制位,客户端向服务器发送第一个网络包时,由于服务器还没有接收过网络包, 所以需要将 ACK 比特设为 0,客户端亦是) 
            Ack(Acknowledge number 确认号码)    

   握手过程如图所示:  

    三次握手的流程:  
    
        (1)第一次握手:主机A发送位码为SYN=1,随机产生Seq(seq number)=123456的数据包到服务器,主机B由SYN=1知道,主机A要求建立联机。
        (2)第二次握手:主机B收到请求后要确认联机信息,向A发送Ack(ack number)=123457(主机A的Seq+1),SYN=1,ACK=1,以及随机产生Seq(seq number)=654321的包。
        (3)第三次握手:主机A收到后检查Ack(ack number)是否正确,即主机A第一次发送的Seq+1,以及位码ACK是否为1,若正确,主机A会再发送Ack(ack number)=(主机B的Seq+1),ACK=1,主机B收到后确认Seq值与ACK=1则连接建立成功。
        (4)完成三次握手,主机A与主机B开始传送数据。

五、四次挥手

    四次挥手,看这位仁兄的吧,我太懒了,他总结的很好 : https://www.cnblogs.com/qdhxhz/p/8470997.html  

    补充:
        1. 多数情况下,都是客户端先关闭  
        2. 套接字是全双工的,所谓全双工:简单解释就是在传输信道上,同时可以进行收发数据,而互不影响  
        3. 因此,四次挥手,总体是分两部分进行:(不考虑延迟的情况)C:client  S:server
                第一部分,C --> S : 对C而言,是关闭了 发送 数据的信道,但是它还可以继续接收来自S端的数据;对S而言,是关闭了 接收 数据的信道,但是S端还可以发送数据;
                第二部分,S --> C :对S端,关闭了发送数据的信道,对C端,关闭了接收数据的信道,
                至此,双方一收一发,就全部关闭了,才是真的关闭 

参考,如有侵权,请速联...
https://blog.csdn.net/qq_32625839/article/details/82111662
https://www.cnblogs.com/xuxinstyle/p/9813654.html
https://www.cnblogs.com/clwydjgs/p/10434795.html
https://www.cnblogs.com/biechishaobing/p/10853666.html
https://www.cnblogs.com/qdhxhz/p/8470997.html

原文地址:https://www.cnblogs.com/zongheng14/p/12038711.html