网络协议系列之一:HTTP

Posted yanghaitao_1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议系列之一:HTTP相关的知识,希望对你有一定的参考价值。

HTTP协议是web开发必须掌握的协议之一,文章的内容并没有按照教科书式对协议本身进行说明。这里特意将一些web开发遇到的常见问题进行了总结。也方便以后自己开发进行迅速查阅。

1、Http的报文结构
http的报文分为请求报文和响应报文,请求报文结构包括:请求行、请求头、请求体;响应报文结构包括响应行、响应头、响应体。下图简要表示了请求报文的结构:

下面是我输入www.baidu.com获取的请求信息和响应信息:

/*请求行,get是请求方法,http://www.baidu.com/是我访问的URL,HTTP/1.1表示http协议的版本号*/
GET http://www.baidu.com/ HTTP/1.1
//从这行开始是请求头
//Host表示要访问的主机
Host: www.baidu.com
//Connection表示其连接属性,keep-alive就是保持连接
Connection: keep-alive
//Accept属性告诉服务端客户端要接受什么类型的数据
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
//表示客户端的浏览器信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.69 Safari/537.36 QQBrowser/9.1.4060.400
HTTPS: 1
//DNT就是Do Not Track,要求应用程序不要跟踪用户的浏览信息,1表示true0表示false
DNT: 1
//列出客户端可接受的编码
Accept-Encoding: gzip, deflate, sdch
//列出客户端可接受的语言类型
Accept-Language: zh-CN,zh;q=0.8
//客户端就是通过这个报文属性给服务器发送cookies
Cookie: BAIDUID=19EDEC9B9CC10B7F16C0C832A656734B:FG=1; BIDUPSID=19EDEC9B9CC10B7F16C0C832A656734B; PSTM=1438532720; BDUSS=ktSU2hkQVpXV

响应报文:

//302是http响应的状态码,302代表永久重定向
HTTP/1.1 302 Moved Temporarily
Date: Wed, 30 Sep 2015 04:40:53 GMT
//Content-Type是MIME的类型
Content-Type: text/html
//响应的字节长度
Content-Length: 215
Connection: Keep-Alive
//在重定向时使用,在请求一个新的资源的时候使用
Location: https://www.baidu.com/
//服务器的一个名称
Server: BWS/1.1
//建议的浏览器渲染引擎
X-UA-Compatible: IE=Edge,chrome=1
//设置客户端cookies
Set-Cookie: BD_LAST_QID=14746362566880008569; path=/; Max-Age=1

//下面是响应正文
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>pr-nginx_1-0-249_BRANCH Branch
Time : Wed Sep 23 14:17:25 CST 2015</center>
</body>
</html>

2、Http的状态码含义
http的状态码是针对响应来讲的,http状态码分为5类33种:
* 1XX
* 2XX
* 3XX
* 4XX
* 5XX
1XX:告诉客户端已经收到了请求
2XX:表示处理成功,包括收到请求、解析了请求信息、受理请求、响应请求等内容
3XX:表示重定向其他URL,客户端要重新发送请求完成后面的处理
4XX:表示客户端错误,如语法错误、资源不存在、访问禁止等
5XX:表示服务端错误,后台异常、版本异常等
更详细的状态码信息可以访问更多Http状态码

3、Http request的几种类型

4、Http1.1和Http1.0的区别
可扩展性:HTTP/1.1定义Via头域,增加了版本号的支持
缓存:HTTP/1.1增加对缓存的重激活机制(revalidation),使用ETag头域唯一描述一个资源;HTTP/1.1增加了Cache-Control头域支持可扩展的指令集
带宽优化:HTTP/1.1中允许请求资源的某部分,而不是整个资源
长连接:HTTP/1.0只支持浏览器与服务器保持短暂的连接,浏览器的每次请求都要建立一个新的连接。而HTTP/1.1允许在一个TCP连接上可以传送多个HTTP请求和响应。HTTP/1.1协议的持续连接有两种方式,即非流水线方式和流水线方式。非流水线方式的特点是,客户在收到前一个响应后才能发出下一个请求;流水线方式的特点是,客户在收到HTTP的响应报文之前就能接着发送新的请求报文
以上就是认为比较重要的区别,其他的区别可以参看这篇文章,翻译版可以参看这篇博客

5、Http怎么处理长连接
在HTTP/1.1中长连接是指一次TCP连接可以处理多次请求与响应,这样可以产生较少的网络流量,提高处理效率。在请求报文中Connection:keep-alive就是告诉服务端保持长连接的作用

6、Cookie与Session的作用与原理
HTTP本身是无状态的,刚开始设计HTTP时,客户端只要完成了其所请求的内容就可以say bye了。但是人们逐渐发现,如果可以让服务器选择性响应内容,客户端获取的信息或更多针对性。但是由于http没有状态,怎么办呢?Cookie与Session就是两种解决方案,简单来说,Cookie是在客户端保持状态的方法,而Session是在服务器保持状态的方法,但是服务器必须和客户端建立联系才能把状态维持下去,所以在客户端的Cookie中有一个Session的标识,称为SessionId。
Cookie机制:服务器通过键值对的形式给客户端发送Cookie信息,当再次访问的时候从Cookie中直接读取,Cookie的内容包括:域和路径、过期时间、名字、值
以上面访问baidu.com为例:域就是baidu.com,路径就是域后面的URL,路径与域构成了Cookie的作用范围,过期时间是指cookie的生存时间,如果不指定过期时间,则默认就是浏览器会话时间,只要关闭了浏览器cookie就失效了。但是这样并不是cookie设计的初衷,通过cookie信息保存在硬盘上,当即使关闭浏览器下次打开cookie仍然是有效的。
Session机制:是一种在服务端保持状态的机制,当客户端需要为请求创建一个session的时候,服务端会检查在客户端是否包含一个session id,如果有就把这个session检索出来,如果没有就会为客户端创建一个session并且生成一个session id保存在客户端。保存session id的方式是cookie,当客户端发送请求的时候,服务器会从发送的cookie检索是否包含有session id。但是cookie是可以用户手动禁止的,那么如何在被禁止的条件下把session ID发送给服务端呢?有一种技术可以实现,就是URL重写。具体是怎么样呢?简单说就是把session id附在URL后面,这里又有两种方式:作为附加信息;作为查询参数;表单隐藏字段

“只要关闭浏览器,session就失效”的误解
要知道,虽然用户把浏览器关闭了,但是服务器对这点是透明的,服务器根本知道用户什么时候关闭了浏览器。所以简答说关闭浏览器session就消失是错误的。我们这么理解基于一个假设,由于sessionId采用的会话cookie来保存的,而会话cookie的一个特点是当浏览器关闭cookie的信息就会失效,那么session id在再次打开浏览器自然是无法找到,也就无法检索原来的session了。但是如果通过硬盘的方式存储session id,这样把原来的session id发送给服务器,就可以检索出来了。

7、电脑上访问一个网页,整个过程是怎么样的
完整的描述应该包括DNS、HTTP、TCP、OSPF、IP、ARP
简略描述如下:
1)DNS把域名解析成对应的IP
2)发送一次请求,服务器返回一个永久重定向响应,这样浏览器就知道要访问的正确网址
3)发送请求html的请求,这个连接过程基于TCP/IP三次握手四次挥手的,建立连接
4)服务器返回一个html响应
5)浏览器根据渲染引擎解析返回的html响应,呈现内容
6)继续发送内嵌在html文件其他资源的请求,比如css、js、图片资源等
7)加载整个页面

8、Ping的整个过程。ICMP报文是什么?
ICMP也叫互联网控制报文协议,是IP层的组成部分,ICMP主要用于传递差错报文以及一些不可达信息。ICMP报文分为查询报文和差错报文,当IP传输发生错误的时候会产生一个差错报文,这个报文会发送给源主机,源主机根据这个报文做出处理。

下面讲一下Ping的过程:
分为两种情况,同网段以及不同网段
先说相同网段:
1)主机A要去Ping主机B, 主机A会封装两层报文,主机A先检查自己MAC地址中是否有B的MAC地址,如果没有就向外发送一个ARP广播包
2)交换机收到这个ARP后,会检查在交换机中是否包含B的MAC地址,如果有就直接返回给A;如果没有就向所有端口发送ARP,该网段的主机的MAC如果与B的MAC地址不同就丢弃,如果主机B收到了该ARP就马上返回相同格式的ARP
3)这时主机A已经有了B的MAC地址,就把B的MAC地址封装到ICMP报中,向主机B发送一个回显请求
4)主机B收到该报文后,知道是主机A的一个回显请求,就会返回一个相同格式的报文。这样就完成了同一个网段的Ping的过程

再说不同网段:
1)主机A要去Ping一个不同网段的主机C,主机A会去找网关转发
2)如果主机A不知道网关的MAC地址,就会发送一个ARP广播一下,这样就知道了网关的MAC地址
3)网关收到主机A的ICMP报文,根据上面的目的IP,会去查找路由表,找到一个出口指针,给主机C发送一个ICMP报文
4)如果网关不知道主机C的MAC地址,就会给网关内所有的主机发送一个ARP,从而找到主机C的MAC地址
5)主机C收到主机A的报文就会给主机A发送一个回显请求。这样就完成了不同网段的Ping的请求

9、C/S模式下使用socket通信,几个关键函数
服务端涉及的关键函数有ServerSocket,accept(),IO流,close(),客户端涉及的函数有Socket,IO流,close()

10、路由器与交换机区别
路由器包含了交换机的功能,交换机主要的作用是扩展接口。比如原来只有一个接口,但是有两个人需要使用,这时就可以使用交换机来扩展接口,两个人使用各自的宽带账号上网,所以彼此的网速不会受到影响。而路由器处理扩展接口,还可以一个账号多个人上网,然而由于所有人共用一个上网账号,必然彼此的网速会收到影响,所以经常会出现,一个人在下载文件的时候,其他人的上网速率会下降的情况。

以上是关于网络协议系列之一:HTTP的主要内容,如果未能解决你的问题,请参考以下文章

计算机网络—— 数据链路层(23):封装成帧差错检测

Linux 下互联网络编程的基础知识

网络协议系列之二:HTTP

网络协议系列之二:HTTP

TCP/IP协议和HTTP协议

icmp协议