您的位置:首页 > 理论基础 > 计算机网络

网络协议系列之一:HTTP(1)

2016-03-28 14:36 260 查看
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=ktSU2hkQVpXVzRZcFJ3dFlrZ2U1aWp4ZEoxTVpJQUJwMGQ0Z2VweUlTfkJGaWRXQVFBQUFBJCQAAAAAAAAAAAEAAABdz4AlY3N10KHW0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGJ~1XBif9VU; ispeed_lsm=0; BDRCVFR[S_ukKV6dOkf]=mk3SLVN4HKm; BD_CK_SAM=1; H_PS_PSSID=1429_14603_12867_17447_17245_16937_17003_15940_12230_17351_16011_17051; BD_UPN=1a314753; sugstore=1; H_PS_645EC=ab8fCT41tKelcC3E%2BEU78Af4afyPd5vkuKRlLeUtva2ucdKprySVETfLkIn1K3SxYok; BDSVRTM=0


更多的请求报文属性可以访问更多Http报文属性

响应报文:

//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、路由器与交换机区别

路由器包含了交换机的功能,交换机主要的作用是扩展接口。比如原来只有一个接口,但是有两个人需要使用,这时就可以使用交换机来扩展接口,两个人使用各自的宽带账号上网,所以彼此的网速不会受到影响。而路由器处理扩展接口,还可以一个账号多个人上网,然而由于所有人共用一个上网账号,必然彼此的网速会收到影响,所以经常会出现,一个人在下载文件的时候,其他人的上网速率会下降的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: