# 计算机网络
> * [OSI七层协议及TCP/IP四层协议](#OSI七层协议及TCPIP四层协议)
> * [通信交互方式](#通信交互方式)
> * [MAC地址和IP地址](#MAC地址和IP地址)
> * [ARP协议的作用](#ARP协议的作用)
> * [ping发生了什么](#ping发生了什么)
> * [traceroute发生了什么](#traceroute发生了什么)
> * [TCP/UDP的区别和应用场景](#TCPUDP的区别和应用场景)
> * [拥塞控制和流量控制的区别](#拥塞控制和流量控制的区别)
> * [TCP滑动窗口实现流量控制](#TCP滑动窗口实现流量控制)
> * [TCP超时重传](#TCP超时重传)
> * [TCP拥塞机制](#TCP拥塞机制)
> * [TCP三次握手及三次缘由](#TCP三次握手及三次缘由)
> * [TCP四次挥手及四次缘由](#TCP四次挥手及四次缘由)
> * [TIME-WAIT状态及2MSL时间](#TIME-WAIT状态及2MSL时间)
> * [域名系统DNS](#域名系统DNS)
> * [统一资源定位符URL](#统一资源定位符URL)
> * [描述一下HTTP协议](#描述一下HTTP协议)
> * [HTTP2.0](#HTTP2)
> * [HTTP持久连接与管线化](#HTTP持久连接与管线化)
> * [HTTP协议请求报文具体信息](#HTTP协议请求报文具体信息)
> * [GET和POST的区别](#GET和POST的区别)
> * [HTTP协议响应报文具体信息](#HTTP协议响应报文具体信息)
> * [HTTP状态码](#HTTP状态码)
> * [浏览器键入URL后的访问流程](#浏览器键入URL后的访问流程)
> * [IP/TCP/UDP分片](#IPTCPUDP分片)
> * [对称密钥和公钥密码体制](#对称密钥和公钥密码体制)
> * [数字签名和数字证书](#数字签名和数字证书)
> * [HTTP和HTTPS的区别](#HTTP和HTTPS的区别)
> * [运输层安全协议及SSL工作过程](#运输层安全协议及SSL工作过程)
> * [HTTPS必须在每次请求中都要先在SSL/TLS层进行握手传输密钥吗?](#HTTPS必须在每次请求中都要先在SSL/TLS层进行握手传输密钥吗)
> * [cookie和session](#cookie和session)
> * [浏览器关闭后,session就销毁了吗](#浏览器关闭后session就销毁了吗)
## OSI七层协议及TCP/IP四层协议
* 七层协议:物、数、网、传、会、表、应
* 物理层 RJ45
* 数据链路层 PPP,IEEE 802.3/802.2
* 网络层 IP,ARP
* 传输层 TCP,UDP
* 会话层
* 表示层 TIFF,GIF,JPEG
* 应用层 DNS,HTTP,FTP
* 四层协议:数据链路层(物理层,数据链路层),网络层(网络层),传输层(传输层),应用层(会话层,表示层,应用层)
* 数据链路层: PPP**MAC不属于协议,只是一个地址**
* 网络层:IP、ARP、ICMP
* 传输层:TCP、UDP
* 应用层:DNS、HTTP、FTP
## 通信交互方式
* 单工通信
* 只能有一个方向的通信没有反方向的交互
* 半双工通信
* 双方可以发送消息,但不能同时发送。可以交替进行一方发送、另一方接收
* 全双工通信
* 通信的双方可以同时发送和接收信息
## MAC地址和IP地址
* MAC地址又叫硬件地址或物理地址,它不是地址位置,实际上是适配器地址,每一台计算机中固化在适配器的ROM中的地址,作用是用来定义网络设备的位置
* IP地址是IP协议提供的一种统一的地址格式,为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
* 两者的区别
* 物理地址是数据链路层和物理层使用的地址,放在MAC帧的首部
* IP地址是网络层和以上各层使用的地址,放在IP数据报的首部
## ARP协议的作用
网络层使用的是IP地址,数据链路层使用的是硬件地址。
ARP协议的用途是为了从网络层使用的IP地址,解析出数据链路层使用的硬件地址。
* 在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表
* 当需要解析时,先去arp缓存表(存着ip-mac对应关系)去查找目标ip的mac地址
* 如果查到了,将目标ip的mac地址封装到链路层数据报
* 如果缓存中没有找到,会发起一个广播:who is ip XXX tell ip XXX,所有收到的广播的机器看这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求的机器
## [ping发生了什么](https://blog.csdn.net/fd8559350/article/details/52135571)
ping主要是为了测试两台主机之间的连通性,通过应用层直接使用网络层ICMP,没有通过运输层TCP和UDP,是通过发送ICMP报文回显请求实现。
> * A主机构建一个ICMP格式的数据包,通过ICMP协议把该数据包和B主机的IP地址一起交给IP协议;
> * IP层构建一个数据包(A主机的IP地址+控制信息+B主机的IP地址),获得B主机的MAC地址,以便构建一个数据帧(IP协议会根据B主机的IP地址和自己的子网掩码判断是不是属于同一层网络,如果是属于同一层网络的话,就会获得B主机的MAC地址,如果以前两机有过通信,在A机的ARP缓存表应该有B机IP与其MAC的映射关系,如果没有,就发一个ARP请求广播,得到B机的MAC)
> * 主机B接受到主机A的发过来的数据帧以后,先检查该帧中包含的B的IP地址,并和本地的物理地址进行比对,如果符合的话,就接受,否则,就抛弃。同样,需要将该数据帧交由自己的IP层协议,IP层检查以后,再交由ICMP协议,构建一个ICMP的应答包,发送给主机A。
## traceroute发生了什么
traceroute用来跟踪一个分组从源点到终点的路径,及到达其中每一个路由器的往返时间
* 通过发送UDP报文,设置目的端口为一个不可能的值
* 将IP首部中的TTL分别设置从1到N,每次逐个增加
* 每次设置TTL后,重新发送数据报,路由器接收到数据报后,将TTL减1,若当前的路由器接收到数据报,发现TTL为1时,会将TTL减1变为0,然后丢弃数据报,发送ICMP时间超过报文
* 如果最后一个数据报刚刚达到主机,数据报的TTL是1,此时主机不把TTL减1
* 因IP数据报中封装的是无法交付的UDP数据报,此时目的主机向源主机发送ICMP终点不可达差错报文,表示达到目的主机
## TCP/UDP的区别和应用场景
##区别
TCP,全称:传输控制协议,面向连接的安全的流式传输协议
UDP,全称:用户数据报协议,面向无连接的不安全的报式传输协议
* 连接
* TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接。
* UDP无连接。
* 服务对象
* TCP是点对点的两点间服务,即一条TCP连接只能有两个端点
* UDP支持一对一,一对多,多对一,多对多的交互通信。
* 可靠性
* TCP是可靠交付:无差错,不丢失,不重复,按序到达。
* UDP是尽最大努力交付,不保证可靠交付。
* 拥塞控制,流量控制
* TCP有拥塞控制和流量控制保证数据传输的安全性。
* UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。
* 报文长度
* TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的,流式传输
* UDP面向报文,不合并,不拆分,保留上面(应用层)传下来报文的边界,直接传输报文。
* 首部开销
* TCP首部开销大,首部20个字节。
* UDP首部开销小,8字节。(源端口,目的端口,UDP数据报长度,检验和,每个字段两个字节)
## 应用场景
* 要求通信数据完整性,则应该选用TCP协议(如文件传输、重要状态的更新,登录数据传输等)
* 要求通信实时性,使用 UDP 协议(如视频传输,通话,屏幕共享软件)
## TCP保证可靠性
(1)序列号、**确认应答、超时重传**
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。
(2)**窗口控制与高速重发控制/快速重传**(重复确认应答)
TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端**如果收到3次相同应答,就会立刻进行重发**;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒......
(3)**拥塞控制**
如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。
**慢启动**:定义**拥塞窗口**,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个rtt),将拥塞窗口大小*2。
**拥塞避免**:设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞。
**将报文段的超时重传看做拥塞**,则一旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并且将窗口大小设为初值1,然后重新进入慢启动过程。
快速重传:在遇到**3次重复确认应答**(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。
然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小。
这样可以达到:在TCP通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量,再进入慢慢上升的过程,网络不会轻易的发生瘫痪。
## 拥塞控制和流量控制的区别
* 拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
* 流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收
## [TCP滑动窗口实现流量控制](https://blog.csdn.net/dangzhangjing97/article/details/81008836)
* 流量控制是让发送方的发送速率不要太快,要让接收方来得及接收,实现对发送方的流量控制.
* 滑动窗口出现的原因:在确认应答策略中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候
* 滑动窗口以字节为单位,而不是报文
## TCP超时重传
* 保证了数据的可靠传输,对于一些出错,丢包等问题TCP设计了超时与重传机制。
* 基本原理:在发送一个数据之后,就开启一个定时器,并设置RTO,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
* 不同的网络情况不一样,不可能设置一样的RTO(超时重传时间),实际中RTO是根据网络中的RTT(报文段往返时间)来自适应调整的
## [TCP拥塞机制](https://blog.csdn.net/shuxnhs/article/details/80644531)
* 拥塞的标志
* 超时重传
* 3次重复的ACK
慢启动,拥塞避免,快恢复,快重传
## ACK SYN FIN解释及是否消耗序列号
* ACK 确认标志位,ACK可以携带数据,若不携带,则不消耗序列号
* SYN 同步标志位,SYN不能携带数据,必须消耗一个序列号
* FIN 终止标志位,FIN可以携带数据,必须消耗一个序列号
## TCP/IP数据链路层的交互过程
数据链层用mac地址作为通信目标,数据包到达网络层准备往数据链层发送的时候,首先会去自己的**arp缓存表**(存着ip-mac对应关系)去**查找该目标ip的mac地址**,如果查到了,就将目标ip的mac地址封装到链路层数据包的包头。如果缓存中没有找到,会**发起一个广播**:who is ip XXX tell ip XXX,**所有收到的广播的机器看这个ip是不是自己的**,如果是自己的,则**将自己的mac地址回复给请求的机器**。
## TCP三次握手及三次缘由
* TCP的三次握手过程如下:
C-> SYN -> S
S->SYN/ACK->C
C->ACK->S
* 为什么TCP三次握手,不能两次或者四次吗?**
* 三次握手是为了防止,客户端的请求报文在网络滞留,客户端超时重传了请求报文,服务端建立连接,传输数据,释放连接之后,服务器又收到了客户端滞留的请求报文,建立连接一直等待客户端发送数据。
* 服务器对客户端的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果客户端并没有收到服务器的回应呢?此时,客户端仍认为连接未建立,服务器会对已建立的连接保存必要的资源,如果大量的这种情况,服务器会崩溃。
* 服务器端给客户端发送同步及确认报文时可以合并,四次会浪费时间
## TCP四次挥手及四次缘由
四次报文中服务器端发送给客户端的请求关闭连接报文FIN和ACK也是合并的,相对于三次来说,只是前面多了一次ACK的确认。
- TCP的四次挥手过程如下:
C->FIN->S
S->ACK->C
S->FIN->C
C->ACK->S
* **为什么TCP四次挥手,不能三次吗?**
* 当客户端确认发送完数据且知道服务器已经接收完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给服务器。
* 服务器收到客户端发送的FIN,表示收到了,就会发送ACK回复。
* 但这时候**服务器可能还在发送数据,没有想要关闭数据口的意思,所以服务器的FIN与ACK不是同时发送的**,而是等到服务器数据发送完了,才会发送FIN给客户端。
* 客户端收到服务器发来的FIN,知道服务器的数据也发送完了,回复ACK, 客户端等待2MSL以后,没有收到服务器传来的任何消息,知道服务器已经收到自己的ACK了,客户端就关闭链接,服务器也关闭链接(服务器比客户端早关闭)。
## TIME-WAIT状态及2MSL时间
* 四次挥手期间,客户端和服务器端都可主动关闭连接,谁主动关闭,谁将进入TIME_WAIT状态
* MSL是最长报文寿命,一般为2分钟,2MSL即4分钟
* 为什么TIME-WAIT状态必须等待2MSL时间?
* **保证最后一次挥手报文能到B,能进行超时重传。**若B收不到A的ACK报文,则B会超时重传FIN+ACK,A会在2MSL时间内收到重传报文段,然后发送ACK,重新启动2MSL计时器
* 2MSL后,本次连接的所有报文都会消失,不会影响下一次连接。
## 域名系统DNS
用于将域名转换为IP地址。
DNS解析过程有两种,分别是递归查询和迭代查询。
* 递归查询
* 若主机询问的本地域名服务器不知道被查询域名的IP地址,本地域名服务器以DNS客户身份,向其他根域名服务器继续发出查询请求报文(代替该主机继续查询),而不是该主机自己进行下一步查询
* 迭代查询
* 当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出IP地址,要么告诉本地域名服务器,应该向哪一个域名服务器进行查询,然后本地域名服务器进行后续查询
## 统一资源定位符URL
统一资源定位符URL,用来表示从互联网上得到的资源位置。
* 一般由四个部分组成
* <协议>://<主机>:<端口>/<路径>
* 主机一般为域名,需要通过DNS系统解析出IP
* 使用HTTP的URL
* http://<主机>:<端口>/<路径>
## [HTTP,HTTPS,HTTP2的长连接和短连接的区别](https://www.cnblogs.com/heluan/p/8620312.html)
### HTTP(端口是80)
- **简单快速**:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST 等等。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
- **数据格式灵活**:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记。
- **无连接**:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- **无状态**:HTTP 协议是无状态协议。无状态,是指协议对于事务处理没有记忆能力。**无状态意味着如果后续处理需要前面的信息,则它必须重传**,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
### HTTPS (端口是443)
实际就是在 TCP 层与 HTTP 层之间加入了 SSL/TLS 来为上层的安全保驾护航,主要用到对称加密、非对称加密、证书,等技术进行客户端与服务器的数据加密传输,最终达到保证整个通信的安全性。
**HTTPS实现的过程**
- **建立连接获取证书**
SSL 客户端通过 TCP 和服务器建立连接之后(443 端口),并且在一般的 tcp 连接协商(握 手)过程中请求证书。即客户端发出一个消息给服务器,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息,SSL 的服务器端会回应一个数据包,这里面确定了这次通信所需要的算法,然后服务器向客户端返回证书。(证书里面包含了服务器信息:域名,申请证书 的公司,公共秘钥)。
- **证书验证**
Client 在收到服务器返回的证书后,判断签发这个证书的公共签发机构,并使用这个机构的公 共秘钥确认签名是否有效,客户端还会确保证书中列出的域名就是它正在连接的域名。
- **数据加密和传输**
如果确认证书有效,那么生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务器,服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通信。
**HTTP 和 HTTPS 的区别**
端口不同:HTTP 与 HTTPS 使用不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
资源消耗:和 HTTP 通信相比,HTTPS 通信会由于加解密处理消耗更多的 CPU 和内存资源。
开销:HTTPS 通信需要证书,而证书一般需要向认证机构申请免费或者付费购买。
### HTTP2.0
HTTP2.0和 HTTP1.X 相比的新特性
1. HTTP/2采用二进制格式而非文本格式
2. HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
3. 使用报头压缩,HTTP/2降低了开销
4. HTTP/2让[服务器](https://www.baidu.com/s?wd=服务器&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)可以将响应主动“推送”到客户端缓存中
## [描述一下HTTP协议](https://www.cnblogs.com/ranyonsue/p/5984001.html)
### 概述
* HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
* HTTP属于应用层协议,基于TCP/IP通信协议来传递数据
### 特点
* 灵活
* HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
* 无连接
* 无连接的含义是通信双方在交换HTTP报文之前不需要建立HTTP连接
* 无状态
* 无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时应答较快。
* 支持B/S和C/S模式
* 默认端口80
* 基于TCP协议
### HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。
* 客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。
* 服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
**HTTP 请求/响应的步骤**
> * **客户端连接到Web服务器**
> 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
> * **发送HTTP请求**
> 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
> * **服务器接受请求并返回HTTP响应**
> Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
> * **释放连接TCP连接**
> 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
> * **客户端浏览器解析HTML内容**
> 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
## [HTTP2](https://www.cnblogs.com/heluan/p/8620312.html)
* 新的二进制格式(Binary Format)
* HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
* 多路复用(MultiPlexing)
* 即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
* pipelining在接收response返回时,必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。这种情况就如图中第三种,第一个请求阻塞后,后面的请求都需要等待,这也就是队头阻塞
* header压缩
* 对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小
* 服务端推送
* 我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了
## HTTP持久连接与管线化
HTTP 协议的初始版本中, **每进行一次 HTTP 通信就要断开一次 TCP连接**。 为解决上述 TCP 连接的问题, HTTP/1.1 和一部分的HTTP/1.0 想出了**持久连接**(HTTP Persistent Connections, 也称为 HTTP keep-alive 或HTTP connection reuse) 的方法。 持久连接的特点是, 只要任意一端没有明确提出断开连接, 则**保持 TCP 连接状态**。
持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销, 减轻了服务器端的负载。 另外, 减少开销的那部分时间, 使HTTP 请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。
* 请求一个万维网文档的时间
* 当建立TCP连接的三次握手前两次完成后,即经过一个RTT时间,万维网客户就把HTTP请求报文,作为建立TCP连接的三次握手中的第三次的数据,发送给万维网服务器,服务器收到HTTP请求后,把请求的文档作为响应报文返回给客户。
* 文档传输时间+2*RTT
* HTTP1.0非持久连接的缺点
* 每请求一个文档,需要两倍RTT的开销。服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接,然后重新建立连接发出请求
* HTTP1.1持久连接
* 万维网服务器在发送响应后仍然在一段时间内保持这段连接,可以使得同一用户继续在该连接上传送后续请求和响应报文
* 持久连接的两种工作方式
* 非管线化
* 发送请求后需等待并收到回应,才能发送下一个请求
* 管线化
* 不用等待响应,直接发送下一个请求,但接收的时候必须按照顺序接收,如果有一个请求阻塞,则接收会全部阻塞
## HTTP协议请求报文具体信息
HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
* **GET**
```C++
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host:img.mukewang.com
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept:image/webp,image/*,*/*;q=0.8
Referer:http://www.imooc.com/
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
空行
请求数据为空
```
* **POST**
```C++
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
空行
name=Professional%20Ajax&publisher=Wiley
```
> * **请求行**,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
> GET说明请求类型为GET,/562f25980001b1b106000338.jpg(URL)为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
> * **请求头部**,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
> * HOST,给出请求资源所在服务器的域名.
> * User-Agent,HTTP客户端程序的信息,该信息由你发出请求使用的浏览器来定义,并且在每个请求中自动发送等
> * Accept,说明用户代理可处理的媒体类型
> * Accept-Encoding,说明用户代理支持的内容编码
> * Accept-Language,说明用户代理能够处理的自然语言集
> * Content-Type,说明实现主体的媒体类型
> * Content-Length,说明实现主体的大小
> * Connection,连接管理,可以是Keep-Alive或close
> * **空行**,请求头部后面的空行是必须的即使第四部分的请求数据为空,也必须有空行。
> * **请求数据**也叫主体,可以添加任意的其他数据。
## GET和POST区别
```C++
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
空行
请求数据为空
```
* 区别
* **get参数通过url传递,post放在request body中**,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
* **POST的安全性要比GET的安全性高**,一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
* **get请求在url中传递的参数是有长度限制的,而post没有**
* **GET产生一个TCP数据包,POST产生两个TCP数据包**。
* 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
* 对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
## HTTP协议响应报文具体信息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
```C++
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8