程序员面试之必考题(二):HTTP的基本原理

来自微信公众号:开点工作室(ID:kaidiancs)

用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议HTTP(HyperTextTransfer Protocol)负责完成的。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送,能够在万维网上进行文本、声音、图像、视频等各种信息的交换。

HTTP协议也是工作在客户机/服务器模式下,分为HTTP客户端和HTTP服务器两个部分,双方每次进行交互,都是由客户端发出的请求和服务器端发出的响应构成。HTTP协议规定的用户使用浏览器访问万维网的过程可以总结为:

1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;

2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;

3.浏览器与网页所在服务器建立TCP连接;

4.浏览器发送HTTP请求报文,获取目标网页的文件;

5.服务器发送HTTP响应报文,将目标网页文件发送给浏览器;

6.释放TCP连接;

7.浏览器将网页的内容包括文本、图像、声音等显示呈现在用户计算机屏幕。

HTTP协议是无连接的,它使用面向连接的TCP协议所提供的服务。同时,HTTP协议也是无状态的,即服务器端不记录客户端访问的时间和次数。最初的HTTP协议版本是1.0版,使用非持续连接(nonpersistentconnection)。每传输一个对象都需要利用1个往返时间RTT建立TCP连接,用1个往返时间RTT申请并传输回对象,即平均用2个往返时间RTT获取一个对象。目前使用比较广泛的是HTTP协议的1.1版本(HTTP/1.1),其在默认情况下使用持续连接(persistentconnection),即利用同一个TCP连接传输多个对象。

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。请求报文是从客户端向服务器发送的报文,响应报文是从服务器到客户端的报文。下面分别介绍请求报文和响应报文的具体格式。

1.HTTP请求报文格式

HTTP请求报文的由请求行、请求头部行、空行和请求数据四部分构成,具体格式如下所示:

(请求行)方法名+空格+URL+空格+版本+回车换行(\r\n)

(请求头部行1)关键字+“:”+空格+值+回车换行(\r\n)

……

(请求头部行N)关键字+“:”+空格+值+回车换行(\r\n)

(空行)回车换行(\r\n)

(请求数据)……

(1)请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。最后由回车和换行表示请求行结束。例如:

GET www.sdu.edu.cn  HTTP/1.1回车换行(\r\n)

其中“方法”字段表示该请求报文希望服务器做什么,请求报文的类型就是由所采用的方法决定的。HTTP请求报文的主要方法包括:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT等。最常见的方法有GET和HEAD。

GET是最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。GET方式不适合传送私密数据和大量数据。

HEAD的功能与GET相似,只是服务器端接收到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

(2)请求头部行(header)

请求头部行包括若干行,每行由关键字及其值构成的,关键字和值用英文冒号“:”分隔,每一行都由回车换行表示结束。请求头部通知服务器有关于客户端请求的信息,典型的请求头部关键字有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Accept-Language:客户端可识别的语言类型

Host:请求的主机名。

Connection:告知服务器发送完文档后释放连接还是保持连接。

(3)空行

最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部了。

(4)请求数据

GET方法中没有请求数据的内容,POST方法使用请求数据,用于客户端向服务器端填写表单等操作。

比如浏览器使用GET方法访问山东大学主页中的“学校简介”文档(URL为www.sdu.edu.cn/2010/xxjj.htm),则其HTTP请求报文可以为:

GET /2010/xxjj.html HTTP/1.1 \r\n

Host: www.sdu.edu.cn\r\n

User-Agent:Mozilla/5.0

Accept-Language:cn */*\r\n

2.响应报文格式

HTTP响应也由四个部分组成,分别是:状态行、消息头部、空行和响应正文。其具体格式如下:

(状态行)版本+空格+状态码+空格+短语+回车换行

(消息头部1)关键字+“:”+空格+值+回车换行

……

(消息头部N)关键字+“:”+空格+值+回车换行

(空行)回车换行(\r\n)

(响应正文)……

在响应报文的状态行中,版本字的表示服务器HTTP协议的版本,状态码字的表示服务器发回的响应状态代码;短语字段表示状态代码的文本描述。状态码由三位十进制数字组成,第一个数字定义了响应的类别,有五种可能取值(1-5),每种状态码的含义如下:

1xx:指示信息。表示请求已接收,继续处理。

2xx:成功。表示请求已被成功接收、理解、接受。

3xx:重定向。要完成请求必须进行更进一步的操作。

4xx:客户端错误。请求有语法错误或请求无法实现。

5xx:服务器端错误。服务器未能实现合法的请求。

常见状态码及状态描述的说明如下:

200 OK:客户端请求成功。

400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

401 Unauthorized:请求未经授权。

403 Forbidden:服务器收到请求,但是拒绝提供服务。

404 Not Found:请求资源不存在,比如输入了错误的URL。

500 Internal Server Error:服务器发生不可预期的错误。

503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

消息头部与请求头部的格式相似,也是包含若干行,每行由关键字及其值构成,常用的关键字包括:

Date:表示返回消息的时间。

Content-Type:表示返回消息的内容类型。

Content-Length:返回内容的长度(字节数)。

Server:使用的服务器软件及其版本号。

同样,最后一个消息头部之后是一个空行,发送回车符和换行符,通知客户端以下不再有消息头部了。

响应正文部分是服务器端根据客户端的请求发回的具体文档内容,以HTML语言表示。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容