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

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

时间: 2024-08-01 22:22:44

网络协议系列之一:HTTP(1)的相关文章

网络协议系列之四:IGMP、ICMP和ARP

前言 IGMP协议是一个组管理协议,它帮助多播路由器创建以及更新与每一个路由接口相连的忠实成员列表(就是与该路由接口连接频率较高).ICMP协议实际上就是差错控制协议,弥补了IP协议没有差错纠正机制以及差错报告的缺憾.ARP是一个地址映射协议,可以把一个IP地址映射为MAC地址. IGMP协议 1.IGMP是管理组成员关系的协议 2.IGMP报文分为成员关系报告报文和成员关系查询报文.成员关系查询报文是为了查找网络中活跃的组成员而发送的报文,而成员关系报告报文是为了记录响应者在网络中的成员关系而

网络协议系列之十一:互联网协议入门(一)

前言 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite).它们对电脑如何连接和组网,做出了详尽的规定.理解了这些协议,就理解了互联网的原理. 下面就是我的学习笔记.因为这些协议实在太复杂.太庞大,我想整理一个简洁的框架,帮助自己

网络协议系列之十二:互联网协议入门(二)

(接上文) 七.一个小结 先对前面的内容,做一个小结. 我们已经知道,网络通信就是交换数据包.电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信.数据包的结构,基本上是下面这样: 发送这个包,需要知道两个地址: * 对方的MAC地址 * 对方的IP地址 有了这两个地址,数据包才能准确送到接收者手中.但是,前面说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发. 上图中,1号电脑要向4号电脑发送一

网络协议系列之三:IP

前言 这篇博客主要对IP协议中一些基础知识点加以总结,并将书中一些晦涩难懂的部分去除了.IP地址协议是网络层中最重要的协议,IP地址协议可以对因特网上的所有设备进行唯一标识,也正因为有了IP协议,我们的计算机才能实现与全球任意一台设备进行通信. 同时这也是网络层存在的意义,我将对部分的内容分为两个部分加以总结:一.首先对IP协议部分的知识加以总结:二.对网络层其他的协议加以总结,包括ICMP.IGMP.ARP等协议. IP协议基础篇 地址空间 这个概念很好理解,如果一个协议用a位(a个bit)表

网络协议系列之二:HTTP(2)

这篇文章继续对HTTP协议进行说明. 一个http事务包括客户向HTTP服务器发送请求以及服务器向客户端发送响应两个过程.根据事务的特点,这两个过程具有原子性,任何一个过程失败都会进行回滚(恢复事务之前的状态).从请求与响应的角度出发,http的知识点都是围绕这两个角度展开的.每次客户的请求都会向服务器发送一个请求报文,请求报文的结构包括请求行.首部行.空行和请求体,一个http响应包括响应行.首部行.空行和响应体.http是基于TCP协议之上的应用层协议,默认使用80端口进行传输,也有基于SS

网络协议系列之七:TCP拥塞控制

拥塞控制是TCP传输中很重要的一环,TCP拥塞控制使用一个拥塞窗口以及拥塞策略来进行拥塞控制.在前面的流量控制中提到发送端的发送窗口取决于接收窗口,实际上,发送方的窗口大小是接收窗口与拥塞窗口中的较小值.拥塞窗口的大小又取决于网络的拥塞状况.而具体确定拥塞窗口大小则需要拥塞策略来决定. 拥塞策略包括慢开始.拥塞避免.拥塞检测.TCP的一般是从一个比较小的传输速率开始,然后迅速增大到阈值,到达阈值后以一个比较小的速率继续传输,如果传输过程中遇到了网络拥塞就执行拥塞避免或者拥塞检测算法传输数据,直到

网络协议系列之五:TCP简介

这里只是对TCP协议做个简要的介绍. TCP协议是基于流的可靠的传输层协议,不同于UDP协议,UDP不保证信息传输的可靠性.这就意味着应用程序把数据流交付给TCP后,要依靠TCP保证数据流完整.一致以及按序到达接收方的应用程序上.TCP主要通过差错控制机制保证可靠性的传输. 1.差错控制机制包括校验和.确认.超时重传这三个工具.校验和主要用来检验数据报文是否受到损伤.如果校验和无效,报文就会在终点被丢弃.确认是接收端用来证实确实收到了报文,在TCP中,使用的是累计确认,接收端会告诉发送端其下一个

网络协议系列之九:TCP计时器

在TCP中有四种计时器:重传计时器.持续计时器.保活计时器和TIME-WAIT计时器 重传计时器 在拥塞控制中有提到RTO--重传计时器.重传计时器是对发送出去的数据进行重传计时,如果在计时器超时后没有收到返回的ACK确认,发送端就会重新发送队列中重传报文.一般俩讲,使用RTO重传计时器有如下规则: 当TCP发送了位于发送队列最前端的报文段后就启动这个RTO计时器 如果队列为空则停止计时器,否则重启计时器 当计时器超时后,TCP会重传发送队列最前端的报文段 当一个或者多个报文段被累计确认后,这个

网络协议系列之八:TCP差错控制

TCP的差错控制主要使用校验和.确认.超时重传这三个工具进行差错控制. 校验和主要用来检验数据报文是否受到损伤.如果校验和无效,报文就会在终点被丢弃. 确认是接收端用来证实确实收到了报文,在TCP中,使用的是累计确认,接收端会告诉发送端其下一个希望接收的字节编号. 超时重传是差错控制的核心.实际上当发送端发送一段字节的数据后,会把这个报文段保存在一个队列中,并启动一个计时器,这个计时器也叫RTO(重传计时器),若计时器超时发送端还没有收到接收端的ACK确认,那么发送端会把队列中的首部报文重新发送