HTTP协议杂谈一

golang推广大使 · · 1647 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

HTTP协议中方法的变更:

  • 0.9版本的http协议中只有GET方法
  • 1.0增加了HEAD和POST方法
  • 1.1 增加了PUT,DELETE等方法

协议作者最初定义这些方法时是期望这些方法的请求的操作与方法名称相符。比如GET方法,应该就是个只读的请求。在遵循http协议方法定义的初衷方面,最出名的莫过于有名的REST api设计。
但是,现在很多很多公司都没有继续遵循这一点,甚至有些公司的http接口的实现基本都是采用POST方法,只有静态资源才是采用GET方法。另外由于一些公司用http服务的形式提供内部接口调用,这部分接口不直接对外,所以也基本上可以不遵循。当然最初http协议只是浏览器和web server之间进行交互的标准,公司内部提供接口调用打破了原有的使用边界。
我想协议最初的制定者肯定没有想的今天大家是这样使用。
http/1.1在1999年发布成为一个正式的标准,这也就要求所有浏览器,服务器必须遵循这么一个标准。

HTTP:超文本传输协议
这个翻译我有点不认可。HTTP的英文是HyperText Transfer Protocol。其中的Transfer是被翻译成传输。TCP的英文是Transmission Control Protocol,其中的Transmission是也是被翻译为传输。但是TCP协议详细描述了传输的过程。HTTP协议并不注重描述传输过程,而且HTTP协议也不是传输层的协议。

HTTP响应的数据也并非全部都是超文本内容。看下面的http响应:

< HTTP/1.1 301 Moved Permanently
< Server: Tengine
< Date: Sat, 21 Mar 2020 15:29:35 GMT
< Content-Type: text/html
< Content-Length: 278
< Connection: keep-alive
< Location: https://www.zhihu.com/api/v4/stickers
< x-cdn-provider: alibaba
< x-edge-timing: 0.010
< Via: cache8.cn779-1[,0]
< Timing-Allow-Origin: *
< EagleId: 6fce044915848045757176507e
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<h1>301 Moved Permanently</h1>
<p>The requested resource has been assigned a new permanent URI.</p>
<hr/>Powered by Tengine</body>
</html>
* Connection #0 to host www.zhihu.com left intact
* Closing connection 0

上面的内容中分两大部分,响应头和响应实体,响应实体里面是超文本的HTML。传递的的重点是响应实体,响应头主要是辅助作用,辅助传递响应实体。例如响应头中的Content-Leng字段和Content-Type字段,这两个字段告诉请求方要传递的内容的大小和类型。方便请求方做好相关准备。

HTTP协议不应该规定如何传输,它现在是运行在传输层之上的协议,没人敢说HTTP必须运行在TCP之上。HTTP/3就是运行在UDP协议之上的。

HTTP协议是文本协议,这句话不是说HTTP响应和请求的BODY是文本的,而是说HTTP协议规定的字段是文本的,比如METHOD,Header等等。

http协议中的时间格式

  • Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
  • Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
    这两个时间格式在golang的time包中都有

关于URI的比较

下面三个URL实质上是相等的:

http代理分类

从保密性角度分类:

  • 匿名代理
  • 透明代理
    从方向上分类:
  • 正向代理:代表客户端向服务器发送请求
  • 反向代理:代表服务器响应客户端的请求

域名相关

time.geekbang.org这个域名,org是顶级域名,geekbang是二级域名,time则是主机名。其实很多时候大家都会说time.geekbang.org 是geekbang.org的二级域名,主机名这个词很少用到。

dig解析域名

dig +trace www.gov.cn

; <<>> DiG 9.10.6 <<>> +trace www.gov.cn
;; global options: +cmd
.           19499   IN  NS  i.root-servers.net.
.           19499   IN  NS  k.root-servers.net.
.           19499   IN  NS  j.root-servers.net.
.           19499   IN  NS  a.root-servers.net.
.           19499   IN  NS  l.root-servers.net.
.           19499   IN  NS  m.root-servers.net.
.           19499   IN  NS  f.root-servers.net.
.           19499   IN  NS  c.root-servers.net.
.           19499   IN  NS  h.root-servers.net.
.           19499   IN  NS  g.root-servers.net.
.           19499   IN  NS  d.root-servers.net.
.           19499   IN  NS  e.root-servers.net.
.           19499   IN  NS  b.root-servers.net.
;; Received 228 bytes from 192.168.1.1#53(192.168.1.1) in 6 ms

cn.         172800  IN  NS  a.dns.cn.
cn.         172800  IN  NS  b.dns.cn.
cn.         172800  IN  NS  c.dns.cn.
cn.         172800  IN  NS  d.dns.cn.
cn.         172800  IN  NS  e.dns.cn.
cn.         172800  IN  NS  f.dns.cn.
cn.         172800  IN  NS  g.dns.cn.
cn.         172800  IN  NS  ns.cernet.net.
cn.         86400   IN  DS  57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn.         86400   IN  RRSIG   DS 8 1 86400 20200403170000 20200321160000 33853 . lltSB0cfjfezZ44zT0xr6KGdYkzx5g03TDLw2jbqCHKiGD6YxIzu6ADK Ivz5eF8dwr7v/V19Y/K1444aDvUYBLXqxmoS+GHBrC886ZHaSHn3Vrwx 6TC5r9AOLKwMKoyoa6ZU3QAKSLdHAK5uXnZo5Rn74TBY5oKI5Gp6DGPH 3wF5Xl6QnYDq8Wg9gfEchH4p58YTa2PuDmbK4VEAg4+nO4cOEpcxPnkW tszOIWu1OZXUaP3pEbsoSrkHTlKUiF92vt4+JIca66OPZ5ruYnk3UYwc /tJEXJ/xkpbHVMaVy+Ru3ilFRkn4H9Z6gTBeKRK0Mv5Z2vFx29CxUuh9 eB1vKw==
;; Received 701 bytes from 199.7.91.13#53(d.root-servers.net) in 283 ms

www.gov.cn.     86400   IN  NS  ns2.cdns.cn.
www.gov.cn.     86400   IN  NS  ns1.cdns.cn.
www.gov.cn.     86400   IN  NS  ns3.cdns.cn.
OD34NAI073IBVQ11VDMKQ9994080ODD6.gov.cn. 21600 IN NSEC3 1 1 10 AEF123AB QT7BTAO7R1Q622588A5EIG6FF22B7IRD  NS SOA RRSIG DNSKEY NSEC3PARAM
OD34NAI073IBVQ11VDMKQ9994080ODD6.gov.cn. 21600 IN RRSIG NSEC3 8 3 21600 20200331045355 20200301041937 54306 gov.cn. pHCRdkrWGAO7ullaBfNOKHwJrPshkSh6xxbHfr6+HHKaAECDxpWHdo+G RG+WQADdbeWdESLZIVkGMo2xwHCLNhS7avXEQ17jmlxA9utSVSdILlgK oDL7kWlto+1/oPCnHXx0uI9x/h7DLEOhGPYAP84/1xqZ/uWk7o0gptHd Djc=
QT7BTAO7R1Q622588A5EIG6FF22B7IRD.gov.cn. 21600 IN NSEC3 1 1 10 AEF123AB 5SN3KQ7NGEDSEKSRAMNFLKT7FFFNGKDE  TXT RRSIG
QT7BTAO7R1Q622588A5EIG6FF22B7IRD.gov.cn. 21600 IN RRSIG NSEC3 8 3 21600 20200331084420 20200301080811 54306 gov.cn. fl59EnbU/vTSILoM8rDWD3Oo0m6+Oh4mUQeWgUd/aRrVVrzXfbMqH3ky YXNRcWvvCU12LULM5Lj9C4qKz5cLMXZphFv4E2KHTn6b8BtVIuvYzGzo oYZj71Az+on53b/rooJpA6TcE09vFJzU1sJuwJ9tCAf4R/gnTpmSnCAW fZY=
;; Received 597 bytes from 2001:dc7::1#53(a.dns.cn) in 6 ms

www.gov.cn.     1800    IN  CNAME   www.gov.cn.bsgslb.cn.
;; Received 71 bytes from 2001:dc7:ffeb::1#53(ns1.cdns.cn) in 4 ms

从上面的结果可以看到,最开始查询的是根域名的解析服务器列表;
然后从d.root-servers.net查询到cn.这个域的解析服务器列表;然后从a.dns.cn查询到www.gov.cn这个域名的最后的ip地址(是IPV6的地址)。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:golang推广大使

查看原文:HTTP协议杂谈一

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1647 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传