理解http协议
1、HTTP概念
1.1 什么是HTTP
- hypertext transport protocol,即超文本传输协议
- 既然是协议,就要有协议双方,http协议的双方是服务器与客户端。
- HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。
- HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
1.2 HTTP的版本
- 有两个版本,1.0和1.1,目前采用的是1.1
- 两个版本的区别:(相对于1.0版本,1.1版本的特点)在一个TCP连接上可以传送多个HTTP请求和响应;多个请求和响应过程可以重叠;增加了更多的请求头和响应头,比如Host、If-Unmodified-Since请求头等
2、请求消息(Request)和响应消息(Response)
2.1 请求消息(Request)
- 请求消息的结构
- 请求行(请求方法、请求的资源地址、 请求协议)
- 请求头(头名称、头值)
- 空行
- 请求正文(只有请求的类型是post才会有)
- 请求方法
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
GET和POST的区别
1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. 而POST方法是把提交的数据放在HTTP包的请求体中。
2、GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
- 请求头
- Host:请求的主机名;
- User-Agent:与浏览器和系统相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的;
- Accept:当前客户端可以接收的文档类型,/表示什么都可以接收;
- Accept-Language:当前客户端支持的语言,可以在浏览器的工具选项中找到语言相关信息;
- Accept-Encoding:支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;
- Accept-Charset:客户端支持的编码;
- Connection: keep-alive:客户端支持的链接方式,保持一段时间链接,默认为3000ms;
- If-Modified-Since: 浏览器告诉服务端修改的时间,利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件;
- Cookie:因为不是第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过;这个Cookie的名字为JSESSIONID!
- Referer:请求来自哪个页面;如果是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;用处: 1. 用来记录广告的信息 2. 防盗链;
- Content-Type:内容类型;
- Content-Length:请求体的长度;
- Date: 发送请求的时间。
更多请参考HTTP响应头和请求头信息对照表
2.2 响应消息(Response)
-
响应消息的结构
-
响应行(响应代码、状态码、状态信息)
-
响应头(头名称、头值)
-
响应正文
-
响应头
-
Location : 服务端用来告诉浏览器,请求需要重定向(必须结合状态码302使用);
-
Server : 服务端用来告诉浏览器,服务器的类型;
-
Content-Encoding: 服务端用来告诉浏览器,服务器对数据采用的编码;
-
Content-Length: 服务端用来告诉浏览器,响应正文的长度
-
Content-Language: 服务端用来告诉浏览器,zh-cn服务发送的文本的语言
-
Content-Type: 服务端用来告诉浏览器,你要用哪个码表来解析二进制数据;
-
Last-Modified : 服务端用来告诉浏览器,访问资源的最后修改时间;
-
Refresh:服务端用来告诉浏览器,多长时间刷新一次;
-
Content-Disposition: 服务端用来告诉浏览器,以下载文件的方式打开文件;
-
Expires: 响应过期的日期和时间;
-
Cache-Control: 告诉所有的缓存机制是否可以缓存及哪种类型;
-
Set-Cookie: 设置Cookie;
更多请参考HTTP响应头和请求头信息对照表
3、HTTP状态码
- 状态码不同范围的含义
状态码 | 含义 |
---|---|
100~199 | 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 | 表示成功接收请求并已完成整个处理过程 |
300~399 | 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址 |
400~499 | 客户端的请求有错误 |
500~599 | 服务器端的请求有错误 |
- 常见状态码含义
状态码 | 含义 |
---|---|
200 | 表示一切正常,返回的是正常请求结果 |
204 | No content,服务器已正确处理,但是响应实体中没有主体; |
206 | Partial content,对于请求头中包含 content-range 字段的,响应一部分数据; |
302 | 指出被请求的文档已被临时移动到别处,此文档的新的URL在Location响应头中给出。 |
304 | 表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求。 |
400 | Bad request,请求报文中有语法错误。 |
401 | Unauthorized,请求需要 HTTP 认证(BASIC / DIGEST 认证,请求头中应包含 www-authenticate 字段)。 |
403 | Forbidden,请求的资源被服务器拒绝了; |
404 | 服务器上不存在客户机所请求的资源。 |
500 | 服务器端的程序发生错误 |
503 | Service unavailable,服务器处于超负载状态或者正在进行停机维护,现在无法处理请求 |
4、关于无状态协议
-
HTTP协议属于无状态协议(Stateless Protocol)
-
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
-
Web服务器不保存发送请求的Web浏览器进程的任何信息。由于Web 服务器要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二次服务请求。
-
HTTP协议是无状态的和Connection: keep-alive的区别
-
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接;
-
Connection: keep-alive表示的是保持TCP连接,而无状态协议是指服务器不保存客户端的任何信息。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间
- 如何解决HTTP无状态的问题
通过Cookie和Session来保存状态信息(HTTP无状态本身并不是什么问题,只是实际中往往需要记住客户端的状态,所以可以这样来解决)
5、关于TCP连接
- HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。
- HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。
- 在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。
TCP 建立连接需要三次握手,断开连接时需要四次挥手。 - 整个HTTP连接到断开的过程如图所示:
- 补充
- 什么是TCP连接的三次握手
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
</br>也可以这样来理解:在客户端和服务器之间建立正常的TCP网络连接时,客户端首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户端再以ACK消息响应。
</br>名词解释
SYN:synchronous,TCP/IP建立连接时使用的握手信号,非常小的一种数据包。
ACK:Acknowledgement,确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。
</br>为什么要三次,两次不行吗?
这是为了为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,主要目的防止server端一直等待,浪费资源。
</br>比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
参考TCP为什么需要3次握手
- 什么是TCP连接的四次挥手
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送;
第二次挥手:服务器收到这个FIN,它发回一个ACK;
第三次挥手:服务器关闭与客户端的连接,发送一个FIN给客户端;
第四次挥手:客户端发回ACK报文确认;
</br>为什么要四次?
因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。
6、HTTP的缓存机制(待补充)
7、关于HTTPS(待补充)
关键字:安全
- HTTPS 相对于 HTTP 就是在应用层和传输层之间添加了 SSL / TLS (加密身份验证层)。默认端口443。
- SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL通过互相认证、使用数字签名确保完整性、使用加密确保机密性,以实现客户端和服务器之间的安全通讯。如图所示。
- 使用HTTPS通信的优点:
客户端产生的密钥只有客户端和服务器端能得到;
加密的数据只有客户端和服务器端才能得到明文;
客户端到服务端的通信是安全的。