web之http协议解析

一. http协议即HyperText Transfer Protocol超文本传输协议,特点:

  1. 灵活:允许传输任意类型的数据对象。
  2. 无连接:每次连接只处理一个请求。客户端请求request->服务器响应response->连接断开。
  3. 无状态:同一个客户端的这次请求和上次请求是没有对应关系。
  4. 处于应用层,基于IP(互联网层)/TCP(传输层)的连接(TCP三次握手建立客户端和服务端的连接)。

http明文传输不安全,使用安全版本https(SSL/TLS加密)

  1. CA(Certificate Authority)证书颁发机构,负责签发证书、认证证书、管理已颁发证书的机关。比较知名的国际品牌:Symantec,GeoTrust,GlobalSign,可以在阿里云等平台购买服务。
  2. 证书是(CA)采用PKI(Public Key Infrastructure)公开密钥基础架构技术,
    签发的对用户的公钥的认证,包括电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。

二. TCP的三次握手

  1. 第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

三. 客服端发送请求

1. 请求行
请求方法URI协议/版本
1). GET 请求获取Request-URI所标识的资源
2). POST 在Request-URI所标识的资源后附加新的数据
3). HEAD 请求获取由Request-URI所标识的资源的响应消息报头
4). PUT 请求服务器存储一个资源,并用Request-URI作为其标识
5). DELETE 请求服务器删除Request-URI所标识的资源
6). TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
7). CONNECT 保留将来使用
8). OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

POST /index.php HTTP/1.1

2. 请求头信息
Transport 头域

  • Connection 表示是否需要持久连接
    Connection: keep-alive - Request后TCP连接不会关闭,被后续请求继续使用
    Connection: close - Request后TCP连接关闭
  • Host 指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。80端口可缺省

Client 头域

  • Accept: 浏览器可以接受的媒体类型(MIME类型)
      Accept: text/html
     Accept: / 代表浏览器可以处理所有类型(经常使用
  • Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
  • Accept-Language:浏览器申明接收的语言
     Accept-Language:zh-cn:中文。如缺省,则服务器认为服务器对各种语言都接受
  • User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
  • Accept-Charset:浏览器申明自己接收的字符集
     Accept-Charset:iso-8859-1,gb2312 如缺省,则接受任何字符集

Cookie/Login 头域

  • Cookie: 最重要的header, 将cookie的值发送给HTTP 服务器

Entity头域

  • Content-Length:发送给HTTP服务器数据的长度,即请求消息正文的长度
      Content-Length: 38
  • Content-Type:定义网络文件的类型和网页的编码,浏览器将以什么形式、什么编码读取这个文件
    Content-Type: application/x-www-form-urlencoded

Miscellaneous 头域

  • Referer:提供了Request的上下文信息的服务器,来自于哪个链接

Cache 头域

  • If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
    If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
  • If-None-Match: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
    If-None-Match: "03f2b33c0bfcc1:0"
  • Pragma: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样
    Pragma: no-cache(只有一个用法)
  • Cache-Control:指定Response-Request遵循的缓存机制(非常重要)
    Cache-Control:Public 可以被任何缓存所缓存
    Cache-Control:Private 内容只缓存到私有缓存中
    Cache-Control:no-cache 所有内容都不会被缓存

四. 服务端的响应

1. 状态行
状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式:
HTTP-Version(服务器 HTTP 协议的版本) Status-Code(服务器发回的响应代码) Reason-Phrase(状态代码的文本描述) CRLF(回车换行)
如:HTTP/1.1 200 OK (CRLF)

  • 状态代码
    1xx:指示信息——表示请求已经接受,继续处理
    2xx:成功——表示请求已经被成功接收、理解、接受
    3xx:重定向——要完成请求必须进行更进一步的操作
    4xx:客户端错误——客户端请求有错误或请求无法实现
    5xx:服务器端错误——服务器未能实现合法的请求
  • 常用编码
    200 OK //客户端请求成功
    303:重定向,即从原url重定向到新的url。 例如php 的hear函数header("localtion:/index.php")
    400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden //服务器收到请求,但是拒绝提供服务,一般是服务器路径没有权限或者是其他权限相关问题
    404 Not Found //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误:一般来说,这个问题都会在服务器端的源代码出现错误时出现,比如出现死循环。
    502 Bad Gateway//作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。比如LNMP ,php-fpm没有启动就会报502错误。
    503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常,比如java 容器部署war的时候,就出现503, 或者是nginx处理的文件没有权限。
    504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应,比如nginx和php-fpm, php设置sleep(200),就会收到504 Gateway Time-out。
    注意:某些代理服务器在DNS查询超时时会返回400或者500错误

2. 响应头信息
Cache头域

  • Date:生成消息的具体时间和日期,即当前的GMT时间
  • Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它
  • Vary:告诉代理服务器缓存两种版本的资源:压缩和非压缩
     Vary: Accept-Encoding

Cookie/Login 头域

  • P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
  • Set-Cookie:把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie(非常重要)

Entity实体头域

  • ETag:和If-None-Match 配合使用
  • Last-Modified:用于指示资源的最后修改日期和时间
  • Content-Type:服务器告诉浏览器自己响应的对象的类型和字符集
     Content-Type: text/html; charset=utf-8
    -Content-Length:实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后再发给客户端。
  • Content-Encoding:文档的编码(Encode)方法。一般是压缩方式
     Content-Encoding:gzip
  • Content-Language:告诉浏览器自己响应的语言

Miscellaneous 头域

  • Server:服务器的软件信息
     Apache/2.2.8 (Win32) PHP/5.2.5
  • X-Powered-By:网站的开发技术
     X-Powered-By: PHP/5.2.5

Transport头域

  • Connection:TCP连接保持或关闭
     Connection: keep-alive,有一个保持时间,可以在服务器软件(如Apache)中设定这个时间。
     Connection: close

Location头域

  • Location:用于重定向一个新的位置, 包含新的URL地址

3. 响应正文
服务器返回的资源的内容,响应头和正文之间也必须用空行分隔

<html>...</html>

五. 例子,在chrome浏览器访问url,点击F12->Network->网址,可查看Headers信息

1. 登录获取服务器授权(POST),获得cookie
Response Headers
Set-Cookie: key1=value1; Path=/; Max-Age=0; Expires=Mon, 11-Feb-2019 13:11:44 GMT
2. 带着cookie请求服务器数据(GET)
General
Request URL: https://***.***.com/***.shtml
Request Method: GET
Status Code: 200 
Remote Address: *.*.*.*:443
Referrer Policy: no-referrer-when-downgrade
Response Headers
Connection: keep-alive
Content-Disposition: inline;filename=f.txt
Content-Type: application/json;charset=UTF-8
Date: Tue, 12 Feb 2019 13:37:24 GMT
Transfer-Encoding: chunked
Request Headers
authority: ***.com
method: GET
path: /***/***.shtml
scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8
content-type: application/x-www-form-urlencoded
cookie: key1=value1;key2=value2;
host: ***.com
referer: https://***.com/index.html
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容

  • 深入浅出HTTP协议(WEB开发和面试必备) 1.基础概念篇 a.简介 HTTP是Hyper Text Trans...
    半世韶华忆阑珊阅读 1,212评论 0 7
  • 参考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麦子阅读 2,939评论 0 14
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,855评论 0 3
  • 本文整理自MIN飞翔博客 [1] 1. 概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或...
    HoyaWhite阅读 2,636评论 2 20
  • 觉得晚上太嗨了也不是一件很好的事,努力想要和别人靠近,但其实越来越远。保持自己的性格和本真就好,何必做一些出力不讨...
    夏七2640阅读 159评论 0 1