http请求过程及拓展内容

HTTP

HTTP(Hyper Text Transfer Protocol):超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 。HTTP的工作方式是客户端与服务器之间的请求-应答协议。

HTTP请求过程

1. 建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

三次握手:用来保障通讯双方有通信的基础

HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议。建立TCP连接时会发生三次握手:(three-way handshake)
firefox > nginx [SYN] 在么
nginx > firefox [SYN, ACK] 在
firefox > nginx [ACK] 知道了

几个报文的标识的解释:
SYN: synchronization(同步)
ACK: acknowledgement(确认:告知已收到)
FIN: finish(结束)

2. Web浏览器向Web服务器发送请求命令

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

3. Web浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

4. Web服务器应答

客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

5. Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

6. Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

7. Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接。

四次挥手:用来保障通讯双方可以安全的回收TCP通信的系统资源

firefox > nginx [FIN] 我要关闭连接了
nginx > firefox [ACK] 知道了,等我发完包先
nginx > firefox [FIN] 我也关闭连接了
firefox > nginx [ACK] 好的,知道了

http请求方法

http报文

http报文就是浏览器和服务器间通信时发送及响应的数据块。
浏览器向服务器请求数据,发送请求(request)报文;服务器向浏览器返回数据,返回响应(response)报文。
报文信息主要分为两部分:
包含属性的首部(header)-------------------------附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中
包含数据的主体部分(body)----------------------HTTP请求真正想要传输的部分

整个http消息结构分为request以及response两部分


request部分分析:

请求的url:即我们地址栏输入的url或者ajax请求的那个参数url。
请求方式:常用的有get、post以及head请求
head请求:head请求是一种返回不呈现数据的请求,也就是只请求一个报文头,通常用于请求一个文件去判断文件是否更新或者在我的项目中去请求服务器时间。

get与post比较:
get请求一般都会用来查询资源信息,post请求一般会用来更新资源信息。
get提交数据方式是将参数放置url之后用&来分开,例如:
http://www.temas.com/myBlog/file/date.php?name=yuchao&age=26
post请求可以以对象字面量形式进行参数传输:{name:"yuchao";age:"26"},所以通过post方式发送的请求中包含内容这一项,而get请求直接将内容附在url之后,正是由于数据传输方式不同导致get传输数据量需要在url字节限制范围之内,而post几乎无限制。同时get参数放置于url中也不利于安全。

Accept:表示浏览器可以接受的类型,一般浏览器都会发给服务器*表示通配所有类型。text/html类型就表示我们常说的html文档。当我们规定了一种类型时候而服务器没有这种类型可以返回,则会抛出一个406状态码的错误(no acceptable)

Accept-Encoding:浏览器自身声明接受的编码方式,通常是压缩方法;
Accept-Language:浏览器自身声明可以接受的语言例如中文:zh-CN;
cookie:将cookie数据发送给服务器

Connection:可选值有
① keep-alive:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接,重新向该服务器发送请求时候不会重新经过三次握手建立链接,而是直接可以进行请求,这个请求时间段可以由服务器端Keep-Alive字段进行设置,当过了这个时间段之后没有任何请求则关闭该连接。http1.0中默认是close,而目前应用的1.1版本中默认是keep-alive长连接。
② Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

User-Agent:客户端使用的浏览器以及操作系统;
Cache-Control:浏览器缓存机制,一般会有max-age=值,或者no-cache或者public、private;
If-Modified-Since:浏览器缓存内容最后修改时间;
if-None-Match:和ETag一起工作,比较两者值 获取内容是否改变。

response部分分析:

status:返回状态码,
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1xx 提示信息 - 表示请求已被成功接收,继续处理
2xx 成功 - 表示请求已被成功接收,理解,接受
3xx 重定向 - 要完成请求必须进行更进一步的处理
4xx 客户端错误 - 请求有语法错误或请求无法实现
5xx 服务器端错误 - 服务器未能实现合法的请求

我们来看一下一些常见的状态码:
200:OK,表明请求成功完成,所有资源成功发送给客户端;
302:重定向,例如google在中国被黑掉之后,只能转战利用香港服务器去请求,我们输入www.google.com,服务器就会返回302 Found,并且客户端接收到的response中location字段包含一个新的url地址,然后浏览器会根据这个地址重新发送一个新url的request;
304:使用的缓存文件
400:客户端请求与语法错误,不能被服务器解读;
403:服务器拒绝服务;
404:请求资源不存在;
500:Internal Server Error 服务器发生了不可预期的错误503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

Keep-Alive:长连接设置的值,如


有两个值:timeout以及max,例如:Keep-Alive:timeout=5,max=100,只有当connection为keep-alive并且服务端支持时候才会生效。

其中timeout表示超时时间,max表示最大连接数。即:在5秒之内服务器始终保持空闲连接,在这五秒之内可以发送请求不必重新建立连接,超过这个时间则会重新建立连接进行请求。

在保持持久连接之间每发送一个请求max值就会减少一个,直到为0为止则会自动断开连接。

一般实际开发中,这个值的设置要根据具体网页中嵌入的请求个数去设置:例如网页中有20个图片,五个外部脚本,三个css样式表。则可以根据传输速度设置超时时间5-20秒之内,max值设置为30-100;

这样设计初衷就是为了既能减少不必要的tcp连接,又能避免频繁的请求造成服务器连接池冗余。

这个值从根本上来说跟前端没有太多关系,但是在网站性能优化很是关键。选择多次建立tcp连接还是选择空余一段时间请求被浪费,就要看实际需求以及能否设置出一个合理的Keep-Alive值。

Conent-Length:表示返回实体内容长度大小,一般应用在返回静态页面或者一张图片并且数据量不大时候被设置;大小为bite字节;例如一张图片的请求:Connent-Length:630;请求一个图片截图如下:


Transfer-Encoding:即服务器端不是一个已知的固定的返回实体时候,服务器会一边产生数据,一边发送给客户端,这时候服务器就需要用Transfer-Encoding:chunked分块编码来代替Conent-Length,设置该key后Content-Length就失效了。对于前端来说只需关心返回的状态是否是成功即可,但是对于后台需要用到这个设置来判断客户端是否接受完全部数据。

Date:服务器返回数据时间,我经常就用这个值来取得服务器时间
Etag:与if-modified-since配合使用;
Last-Modified:作用是用于指示资源的最后修改日期和时间。一般都用来处理缓存。
Content-Type:作用是WEB服务器告诉浏览器自己响应的对象的类型和字符集,例如:Content-Type: text/html;charset=utf-8,Content-Type:image/jpeg
server:指明服务器软件版本;
Referer:告诉服务器该请求是在哪个链接发过来的,据此可以统计从某个页面跳转过来次数;
X-powered0by:表示该网站开发技术

HTTP请求/响应报文的组成

HTTP请求报文组成:请求行+请求头+请求体
HTTP响应报文组成:响应行+响应头+响应体
请求行:请求方法(HEAD/GET/POST) + 请求URL + HTTP协议版本
响应行:HTTP协议版本 + 状态码 + 状态码描述
请求头:比如客户端的Cookie和User-Agent就放在这里
响应头:比如服务器的Set-Cookie和Server信息就放在这里
请求体:比如客户端POST的数据就放在这里(对比:GET的数据放在请求行的URL里)
响应体:比如服务器返回的HTML和JSON数据就放在这里

GET

用于获取数据,使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器

特点:
  1. GET请求能够被缓存
  2. GET请求会保存在浏览器的浏览记录中
  3. 以GET请求的URL能够保存为浏览器书签
  4. GET请求有长度限制
  5. GET请求主要用以获取数据

POST

用于上传数据,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器

特点:
  1. POST请求不能被缓存下来
  2. POST请求不会保存在浏览器浏览记录中
  3. 以POST请求的URL无法保存为浏览器书签
  4. POST请求没有长度限制

区别

get在url里传送数据:安全性低、容量小
post安全性一般、容量几乎无限
get便于分享(商品地址和url有关),适合获取,且会缓存
post更适合上传(图片等)


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

推荐阅读更多精彩内容