个人理解,OSI七层模型,CS之间的通信流程如图所示。
http 是超文本传输协议。超文本:就是超过了普通的文本,包括:文字、图片、视频等的混合体,最关键的是超链接。 传输:两点之间传输数据(允许中间有中转)
请求报文:
响应报文:
host字段:
可以将请求发送到同一台服务器上不同的网站。例如,一个IP(111.111.111.11)地址可以对应多个域名A、B、C。然后通过域名供应商将ABC与服务器的IP地址关联起来,那么通过ABC任何一个域名最终都会访问到IP111.111.111.11。这时就需要host了,host可以看成服务器IP上的一个站点,每次通过ABC域名都会访问到同一个服务器,但是通过不同的HOST可以区分出访问的服务器的不同的站点。
host:www.baidu.com
Content--Length字段:
Content--Length:1000 表明此次回应的数据长度为1000字节,此长度后面的字节不属于此次回应的数据。
Connection字段:
表明客户端要求服务器试用TCP持有连接,以便其他请求复用,直到客户端或者服务器主动断开连接。
Connection:keep--alive
http/1.1 版本的默认连接都是持久连接,但是为了兼容老版本,还是需要指定,不是标准字段。
Content--type字段:
用于服务器回应时,告诉客户端,本次数据的格式。
Content--Type:text/html;charset=utf-8 表明发送的是网页,编码是UTF-8。
客户端在请求的时候,可以使用Accept字段表明可以接受的数据格式。
Accept:*/* 表明客户端可以接受任何格式的数据。
Content-Encoding字段:
表明数据的压缩方法,表示服务器返回的数据使用什么压缩格式。
Content-Encoding:gzip 服务器返回的数据使用了gzip的压缩格式,客户端需要用此方式解压、
客户端在请求的时候用Accept--Encoding字段说明接受哪些压缩方法:
Accept--encoding:gzip , deflate
get请求的含义是从服务获取资源,是安全幂等的,post请求是向URI指定的资源提交数据,不是安全幂等的,数据就放在报文的body。get类似看朋友圈,post则是评论朋友圈。
在http协议里,安全和幂等的概念,安全就是请求的方法不会破坏服务器的资源,幂等就是多次操作,服务器返回的资源相同。
GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。
GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。
优点:
缺点:
http协议是基于TCP/IP协议的,使用了 请求--应答 的通信模式。因此性能关键在于这两点
长连接:早期的http1.0 性能上的最大问题就是每次发起一个请求,都要新建一次TCP连接(三次握手),并且是串行去请求,做了无谓TCP连接和断开,增加了通信的开销。
为了解决连接问题,http1.1提出了长连接(持久连接)的通信方式,有效的减少了无谓TCP连接和断开。持久连接的特点就是,只要任意一段没有明确提出断开连接,就是保持连接状态。
管道传输(pipeline):http1.1采用了长连接的方式, 使得管道传输成为了可能。即在同一个TCP连接,客户端可以在同一个TCP连接中发起多个请求,能够减少整体的响应时间。
例如:客户端需要两个资源。以前的做法就是在同一个TCP连接中,先发送A请求,然后等待服务端做出回应,收到之后在发送B请求.管道机制允许同时发出A和B,但是服务器还是按照顺序,先回应A请求,在回应B请求。要是A回应比较慢,那么B就要排队等待。这被称为“队头堵塞”。
队头堵塞
第一次握手:建立连接. 客户端(client) 发送连接请求.将SYN设置为1,SequenceNumber(seq)设置为x;接下来客户端进入SYN_SENT状态.等待服务器(service)的确认.
第二次握手:服务器收到客户端的SYN报文段,对SYN报文进行确认,设置Acknowledgment Number(ACK)为x+1(seq+1),同时设置自己的SYN请求信息,设置SYN为1,将seq设置为y,服务端将上述所有的信息都放到SYN + ACK 报文之后,发送给客户端,此时服务端进入SYN_RCVD状态.
第三次握手:客户端收到服务器的SYN+ACK报文后,将ACK设置为y+1,先服务器发送ACK报文,这个报文发送完毕后,客户端和服务器都进入ESTABLISHED(TCP链接成功)状态,完成TCP的三次握手.
四次挥手的过程:
第一次挥手: 客户端设置seq和ACK,向服务器发送一个FIN报文段.此时客户端进入FIN_WAIT_1状态,表示客户端没有数据向服务器发送了.
第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回了一个ACK报文.
第三次挥手:服务端向客户端发送方FIN报文段,请求关闭连接,同时服务器进入LAST_ACK状态.
第四次挥手:客户端收到服务器的发送的FIN报文段,向服务器发送ACK报文段,然后客户端进入TIME_WAIT状态.服务器收到客户端的ACK报文后,就关闭链接.此时客户端等待两秒(最大报文生成时间)后,依然没有收到回复,说明服务器已经正常关闭了,这样客户端也可以关闭连接了.