欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Http协议简介

程序员文章站 2022-06-09 18:46:55
1 URL与资源 1)URI和URL URI:统一资源标识符。用于标识某一互联网资源名称的字符串。包括URL和URN URL:统一资源定位符。URI的一种形式。现在基本都是用URL来代表...

1 URL与资源

1)URI和URL
URI:统一资源标识符。用于标识某一互联网资源名称的字符串。包括URL和URN
URL:统一资源定位符。URI的一种形式。现在基本都是用URL来代表URI。可以将URL和URI等同来看待。
URN:统一资源名称。URI的另一种形式。仅仅处于试验阶段。它用资源名称来代表资源,与路径无关。故资源移动位置时,不用改变。

2)URL格式
scheme://user:password@host:port/path;params?query#frag
scheme:协议,如http https ftp
host:主机名,标示了server地址,DNS会将host名解析为IP地址。
port:端口号,表示server上的对应的应用程序。http默认端口号80,https默认443
path:server上的文件路径
params:告诉server更详细的信息,如编码格式
query:查询server端数据库可能使用到。如?item=12345, 表示查询数据库中的Item号码为12345的数据
frag 片段(fragment):只引用HTML的一个章节,而不是所有的HTML文档。server回传的仍然是整个HTML文档,frag供客户端使用

3)相对URL
i. 不完整,相对于base URL来解析它的绝对URL
ii. 如HTML文档为http://www.test.com/test.html, 其内容中有\< a href=’./hamers.html’ />,此link即为相对URL,它的base URL就是HTML文档的url,故最后解析出的url即为http://www.test.com/hamers.html
iii. 相对URL减小了数据量,同时增加了可移植性

4) 编码方式
URL字符集只支持us-Ascii
转义字符: 用来表示不安全的字符集,如空格,~。 不使用转义的话,它们可能会被浏览器误解。%7E表示~。转义的表示方法为:%十六进制数

2 http报文

1)client发送的request和server回复的response都是通过http报文的形式发送的。
2)http报文结构
Http协议简介

起始行 start-line:
i. request:method url version
ii. response: version code reason

首部: header(可选)
i. 每行一个key:value, 最后一行是一个空行
ii. 通用首部,request和response都能使用喎?http: www.2cto.com/kf/ware/vc/"="" target="_blank" class="keylink">vcD4NCmNvbm5lY3Rpb26jumtlZXAtYWxpdmW1yMGsvdPW0NPDtb0gRGF0ZaO6sajOxLXEtLS9qMqxvOSjrNei0uKyu8rHzsS1tbXEyrG85CBUcmFpbGVyo7qyydPDt9a/6bSryuTKsaOs1eK49srXsr/B0LP2zrvT2rGozsTNz7nSsr+31rXEyteyv7yvus+ho9XiuPbK17K/0ruw48rHtchib2R5yLe2qMHLssXE3Mi3tqjPwsC0IFRyYW5zZmVyLWVuY29kaW5no7qxqM7EseDC67e9yr0gVmlho7qxqM7Evq25/bXE1tC85L3ateOjrL/J0tTX9mxvZ6GjyOe0+sDto6zN+LnYtcihoyBjYWNoZS1jb250cm9sDQo8cD5paWkuIHJlcXVlc3Qgyteyv6Osvfa99nJlcXVlc3S/ydLUyrnTwzwvcD4NCkZyb22jqL/Nu6e2y9PDu6e1xGVtYWlso6mjrEhvc3SjqHNlcnZlctb3u/q6zbbLv9q6xaOpo6xSZWZlcmVyo6jOxLW1VVJMo6mjrHVzZXItYWdlbnSjqOSvwMDG98P7s8ajqSBBY2NlcHSjqL3TytXOxLW1wODQzaOpo6xBY2NlcHQtY2hhcnNldKOsIEFjY2VwdC1FbmNvZGluZ6OsPGJyIC8+DQpURaOouObL33NlcnZlcr/J0tTKudPDxMTQqcCp1bm0q8rkseDC66OsyOe31r/pseDC66OpIEV4cGVjdKOozPW8/sfrx/OjqaOsSWYtTWF0Y2ijrElmLW1vZGlmaWVkLXNpbmNlo6iz/bfH1NrEs8jVxtq689DeuMS5/aOst/HU8rK708O3osvNzsS1taOpo6xJZi1SYW5nZaOottS3ts6nzPW8/sfrx/OjqSBBdXRob3JpemF0aW9uo6hjbGllbnTX1MnttcTIz9ak0MXPoqOsyOfTw7unw/ujrMPcwuujqaOsQ29va2llo6jP8rf+zvHG97Sry821xMHuxcajrNPDu6fD+6Osw9zC67/J0tSw/Lqs1NrG5NbQo6kgUHJveHktQXV0aG9yaXphdGlvbqOoY2xpZW50t6LLzbj4cHJveHm1xMjP1qTQxc+io6mjrFByb3h5LWNvbm5lY3Rpb26jqL3ivvbDpLT6wO221GtlZXAtYWxpdmW1xLK71qez1sq508OjrNPrY29ubmVjdGlvbrmmxNzP4M2so6kNCjxwPml2LiByZXNwb25zZcrXsr+jrL32vfZyZXNwb25zZb/J0tTKudPDPC9wPg0KQWdlo6i5/cbayrG85KOsz+C21MqxvOSjqSBBY2NlcHQtUmFuZ2VzKLf+zvHG97/JvdPK3LXEt7bOp8Dg0M2jqSBQcm94eS1BdXRoZW50aWNhdGWjqMC019S0+sDttcS21L/Nu6e2y7XE1srRr8HQse2jqSBzZXQtY29va2llo6i45svfY2xpZW5019S8utTac2VydmVyyc/J6NbDwcvTw7uno6xjbGllbnTWrrrzu+G72LSr0ru49mNvb2tpZaOpIHd3dy1BdXRoZW50aWNhdGUowLTX1Lf+zvHG97XEttS/zbuntsu1xNbK0a/B0LHto6kNCjxwPnYuIMq1zOXK17K/PC9wPg0KQWxsb3ejqMHQs/a/ydLUttS0y8q1zOXWtNDQtcTH68fzt723qKOpIExvY2F0aW9uo6jW2Laoz/LKsdPDo6y45svfY2xpZW50zsS1tbXEdXJso6kgY29udGVudC1sZW5ndGijrCBjb250ZW50LXR5cGWjrCBjb250ZW50LU1ENaOoYm9kebXETUQ11arSqqOpIEV4cGlyZXOjqLu6tOa5/cbayrG85KOsc2VydmVyt7W72Lj4Y2xpZW5008O1xKOpo6xFVGFno6jT67TLyrXM5c/gudi1xMq1zOWx6rzHo6mjrExhc3QtbW9kaWZpZWSjqMq1zOXX7rrztcTQ3rjEyrG85KOpDQo8cD5ib2R5o6i/ydGho6k8L3A+DQo8cD4zo6ltZXRob2SjunJlcXVlc3S1xLe9t6g8L3A+DQpHRVSjurvxyKHSs8PmxNrI3aOsx+vH87LOyv23xdTawct1cmzW0CBIRUFEo7rWu7vxyKHP7NOmtcTK17K/o6yyu9PDt6LLzWJvZHk8YnIgLz4NCr/J1Nqyu7vxyKHXytS0x+m/9s/Co6zPyLLpv7TXytS0x+m/9qOsyOdtaW5lIHR5cGUgv8nPyLLpv7TXytS0yse38bTm1Nogv8my6b+018rUtMrHt/Gxu9DeuMTBy6GjyrnTw2NhY2hl0enWpMrHt/G5/cbayrG74cq508MgUE9TVKO6u/HIodKzw+bE2sjdo6yyzsr9t8XU2sHLYm9kedbQo6y2+LK7ysd1cmzW0CBQVVSjusnPtKujrMjDc2VydmVytLS9qNK7uPZyZXF1ZXN01tB1cmzD/MP7tcTOxLW1o6zI57n70tG+rbTm1NqjrNTyzOa7u8v8IERFTEVURaO6yb6z/XNlcnZlcsnPtcTOxLz+o6yyu9K7tqhzZXJ2ZXK74dans9YNCjxwPk9QVElPTlOjurLpv7RzZXJ2ZXLWp7PWxMTQqW1ldGhvZDwvcD4NCjxwPkdldLrNUG9zdMrHztLDx9fus6PTw7W9tcTBvdbWbWV0aG9ko6zL+8PHtcTH+LHwysejukdldL2rx+vH87LOyv23xdTawct1cmzW0KOssfDIy7a8xNy/tLW9o6y5yrCyyKvQ1L3Psu6ho1Bvc3S9q8frx/Oyzsr9t8XU2sHLaHR0cLGozsS1xGJvZHnW0KOssLLIq9DUschHZXS436GjPC9wPg0KPHA+NKOp17TMrMLro7pyZXNwb25zZbvYuLS1xNe0zKw8L3A+DQoxv6rNtyBpbmZvPGJyIC8+DQoxMDCjumNvbnRpbnVlo6zK1bW9wctyZXF1ZXN0tcSz9cq8sr+31qOsx+tjbGllbnS8zND4t6LLzXJlcXVlc3Sho7OjvPuzob6wzqqjrGNsaWVudNPQuPZib2R50qq3osvNo6zP68/Iv7S/tHNlcnZlcsrHt/G908rc1eK49mJvZHmho7nKz8i3osvN0ru49ta1zqoxMDAgY29udGludWW1xGV4cGVjdMrXsr+ho8jnufu3/s7xxve908rco6y74beiy83Su8z1MTAwIGNvbnRpbnVltcTP7NOmoaPWrrrzY2xpZW501Nm3osvNYm9keaGjIDEwMaO60K3S6cfQu7sgMr+qzbcgs8m5pjxiciAvPg0KMjAwo7pvayAyMDGjumNyZWF0ZWSjrHB1dMnPtKtyZXF1ZXN0s8m5pta00NDBy6Osc2VydmVyyc/OxLW10tG+rbS0vai6w8HLIDIwMiCjuiBhY2NlcHSjrMfrx/PS0b6tsbu908rco6y1q7u5w7vT0LSmwO0gMjAzo7pub24tYXV0aG9yaXRhdGl2ZSBpbmZvcm1hdGlvbiwgz+zTptbQtcRib2R5srvKx8C019TUtLbLt/7O8cb3o6y2+Na7ysfSu7j2uLGxviAyMDSjuk5vIGNvbnRlbnSjrM/s06bW0MO709Bib2R5IDIwNaO6cmVzZXQgY29udGVudKOsuObL3+SvwMDG98fls/21scew0rPD5tbQy/nT0EhUTUyx7bWl1KrL2CAyMDajunBhcnRpYWwgY29udGVudKOss8m5pta00NDBy9K7uPayv7fWu/LV33JhbmdltcTH68fzIDO/qs23INbYtqjP8jxiciAvPg0KMzAwo7ogbXVsdGlwbGUgY2hvaWNlo6wgv827p7bLtcTH68fzttTTpsHLtuC49tfK1LSjrLHIyOe0y0hUTUzOxLW109DTotPvdmVyc2lvbrrNt6jT73ZlcnNpb24gMzAxo7ptb3ZlZCBwZXJtYW5lbnRseaOsVVJMttTTptfK1LSxu9LG19/By6OscmVzcG9uc2W1xGxvY2F0aW9uyteyv7vhuObL32NsaWVudNfK1LTP1tTatcRVUkwgMzAyo7pmb3VuZKOs0+szMDHA4MvGo6xyZXNwb25zZbXEbG9jYXRpb27K17K/0rK74bjmy99jbGllbnTXytS0z9bU2rXEwdnKsXVybKOstavWrrrztcTH68fzu7nKx8q508PAz1VSTCAzMDOjunNldCBvdGhlcqOsIMjDY2xpZW50yrnTw8Ht0ru49nVybKOs1Npsb2NhdGlvbsrXsr/W0Na4s/YgMzA0o7pub3QgbW9kaWZpZWSjrM7EtbXOtLG70N64xKGjyrnTw2NhY2hlyrGjrM7EtbW5/cbauvOjrGNsaWVudLvhsunRr87EtbXKx7fxsbvQ3rjEoaPOtLG70N64xKOs1PK8zND4yrnTw2NhY2hlo6y2+LK70OjSqtbY0MLH68fzzsS1taGjIDMwNaO6dXNlIHByb3h5o6yx2NDrzai5/dK7uPa0+sDtwLS3w87K18rUtKOstPrA7VVSTNTabG9jYXRpb27W0Lj4s/YgMzA3o7p0ZW1wb3JhcnkgcmVkaXJlY3SjrNPrMzAxwODLxqOswdnKscq508Nsb2NhdGlvbsrXsr/W0HVybKOs1q6687XEcmVxdWVzdLu5ysfKudPDwM91cmwgNL+qzbcgY2xpZW50tO3O8zxiciAvPg0KNDAwo7piYWQgcmVxdWVzdKOscmVxdWVzdLjxyr21yL/JxNzT0M7zIDQwMaO6dW5hdXRob3JpemVko6xjbGllbnTDu9PQ18rUtLXEt8POysioz96jrLHY0OvPyMjP1qQgNDAzo7pmb3JiaWRkZW6jrMfrx/Oxu3NlcnZlcr7cvvjByyA0MDSjum5vdCBmb3VuZKOsdXJsttTTptfK1LTU2nNlcnZlcsnPw7vT0CA0MDWjum1ldGhvZCBub3QgYWxsb3dlZKOscmVxdWVzdNbQtcRtZXRob2TT0M7zIDQwNqO6bm90IGFjY2VwdGFibGWjrGJvZHmyu7G7c2VydmVyvdPK3CA0MDejunByb3h5IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVko6zT6zQwMcDgy8ajrNPD09rSqsfzttRjbGllbnTIz9aktcS0+sDtt/7O8cb3oaPT0MqxuvK0+sDt0rLQ6NKqyKjP3rLFxNy3w87KIDQwOKO6cmVxdWVzdCB0aW1lb3V0IDQwOSCjumNvbmZsaWN0o6zH68fzv8nE3NTa18rUtMnP0v23otK70Kmz5c27IDQxMKO6Z29uZaOs0+s0MDTA4MvGo6yx7cq+18rUtLG70sbX38HLo6y1q3NlcnZlctT4vq3TtdPQuf3V4rj218rUtCA0MTGjumxlbmd0aCByZXF1aXJlZKOs0qrH89TacmVxdWVzdNbQsPy6rGNvbnRlbnQtbGVuZ3RoyteyvyA0MTKjunByZWRpY3Rpb24gZmFpbGVko6y/zbuntsu3osbwwcvM9bz+x+vH86OsxuTW0NK7uPbM9bz+yqew3MHLoaOw/LqsZXhwZWN0yteyv7XEvs3Kx8z1vP7H68fzIDQxM6O6cmVxdWVzdCBlbnRpdHkgdG9vIGxhcmdlo7pyZXF1ZXN0t6LLzbXEYm9kecyrtPPBy6OsscjI58nPtKvBy9K7uPbMq7TztcTOxLz+IDQxNKO6cmVxdWVzdCBVUkkgdG9vIGxvbmejunJlcXVlc3TW0LXEdXJszKuzpKGj09C1xHNlcnZlcs6qwcu3wNa5tvHS4rmlu/ejrLbUMUtC0tTJz7XEVVJMsru0psDtIDQxNaO6dW5zdXBwb3J0ZWQgbWVkaWEgdHlwZaO6cmVxdWVzdNbQtcRib2R5tcRtaW5lIHR5cGWyu7G7c2VydmVyvdPK3CA0MTajunJlcXVlc3QgcmFnbmUgbm90IHNhdGlzZmllZKOscmVxdWVzdLXEysfEs7j218rUtLXExLO49re2zqejrNXiuPa3ts6nzt7Qp8qxt6LLzbTL17TMrMLrIDQxN6O6ZXhwZWN0YXRpb24gZmFpbGVko6zO3reowvrX43JlcXVlc3TW0LXEZXhwZWN0yteyvyA1v6rNtyBzZXJ2ZXK07c7zPGJyIC8+DQo1MDCjumludGVybmFsIHNlcnZlciBlcnJvcqOsc2VydmVy0/a1vcHLt8Gwrcv8zqpyZXF1ZXN0zOG5qXJlc3BvbnNltcS07c7zo6y3osvNtMtjb2RlIDUwMaO6bm90IGltcGxlbWVudGVko6xzZXJ2ZXK447K7tqhyZXF1ZXN01tC1xLe9t6ggNTAyo7piYWQgZ2F0ZXdheaOszfi52HNlcnZlcrP2tO3By6OsscjI5834udjBrL3Tsru1vcv8tcS4uM34udggNTAzo7pzZXJ2aWNlIHVuYXZhaWxhYmxlo6xzZXJ2ZXLEv8ewzt63qMzhuam3/s7xo6y1q72rwLS/ydLUzOG5qbf+zvEgNTA0o7pnYXRld2F5IHRpbWVvdXSjrM34udi78rT6wO21yLT9we3Su7j2t/7O8cb3yrGzrMqxwcujrLTLyrG74bvYuLRjbGllbnTV4rj2Y29kZSA1MDWjumh0dHAgdmVyc2lvbiBub3Qgc3VwcG9ydGVkDQo8aDIgaWQ9"3-连接管理">3 连接管理

1)连接流程

a. 浏览器通过url解析出host b. 浏览器查询host的DNS,转换为IP地址 c. 浏览器获得端口号 d. 浏览器发起到IP地址确定端口号的连接(三次握手) e. 浏览器向server发送一条http request报文 f. 浏览器从server读取返回的http response报文 g. 浏览器关闭连接

2)IP分组:TCP通过名为IP分组的小数据块来发送数据。每个IP数据块包含

IP分组首部(20B) TCP段首部(20B) TCP数据块(0B或多个字节)
有用数据即为TCP数据块,故应该尽量将TCP数据块塞满,以提高效率。

3)操作TCP连接的API:socket,Linux driver对socket提供了支持,流程为:

server创建socket,bind到端口80上,允许socket连接(listen),并等待连接(accept) client获取用户输入的IP和端口号,创建socket,connect到server的port上去。 通知server app有连接到来,读取connect请求 三次握手,连接成功。client发送http request server处理http request,并回传http response,close连接 client接收http response,close连接。

4)TCP性能考虑

http事务时延

client要去查询DNS server,将host转化为IP地址 TCP连接三次握手时延 传输request和response有时延

TCP连接握手时延

延迟确认

每个TCP都有一个序列号和数据完整性的校验和,TCP会做校验,保证数据传输的正确性。对于每个数据段,都会发送一个确认 延迟确认算法思路为,在发往同一个server的数据中捎带这个确认,从而减少传输事务。搭顺风车的想法。

TCP慢启动

TCP连接刚开始时,会限制它的最大连接速度。随着时间推移,传输速度可以提高。称为TCP慢启动 故新的TCP连接速度会比经过调谐的老连接慢。 解决方法:重用连接,持久连接机制

5)Connection首部

connection首部中包含的首部,不应该被转发出去。比如client传给proxy时,proxy转发到server时,应该删除connection首部和connection首部中包含的首部 connection中的close表示处理完后关闭连接。

6)并行连接

a. 打开多条连接,并行的执行多个事务 b. 串行连接如果不能充分利用信道速度,则并行连接效率要高于串行。反之,并行效率会低。因为建立多条连接需要耗费时间 c. 并行连接可以同时加载多幅图片,给用户感觉也是要快一些。

7)持久连接

一次事务传输结束后仍然保持TCP连接。 优点:减少连接握手时延,避免TCP慢启动。 缺点:管理不当,会出现大量的空闲连接,这些连接没有关闭,仍然耗费client和server的资源。 keep-alive:
request的header中包含 connection:keep-alive 如果server支持并愿意持久连接,则在response中也会包connection:keep-alive。如果response中没有发现此header,则说明server不支持。 哑代理:识别不了keep-alive的代理。代理会在事务结束后等待连接关闭,但是client和server都能理解keep-alive,他们不会关闭连接。形成死循环。解决方法:
proxy必须删除connection首部,不能转发他。如果proxy能理解keep-alive,它自己再入到header中发送给server 使用proxy-connection代替connection。能理解的proxy会将proxy-connection替换为标准的connection首部发给server,不能理解的proxy则继续转发proxy-connection,server不会理会它。 persistent-connection,http1.1持久连接
http1.1默认激活持久连接,不像1.0中默认没有激活keep-alive那样。 如果不想使用持久连接,则必须添加header,connection:close。这样在事务传输完成后,连接会关闭 不发送connection:close,不代表server承诺会一直保持连接。是否关闭的决定权在server。 一个client对server或proxy,最多只能有两条持久连接。

8)管道化连接

在持久化连接基础上,做的又一个优化 可以将多条request放在队列中,第一条request发送后,立即发送第二条,不用等待第一条request的response回复到client 限制
如果不支持持久连接,则不能使用管道连接。管道连接是建立在持久连接基础上的又一个优化 必须按照request的顺序来发送response client必须能够应对没收到response而连接被关闭的情况,此时一般会重发request 重发request时,应该注意可能有副作用。如post上传,不能重复发送request

9)关闭连接

server可自主决定何时关闭连接,不受keep-alive影响 每条response应该都有准确的content-length。但它也有可能不正确,此时已连接关闭为准 连接关闭可能导致副作用,比如上传文件,提交订单等。之后重发request可能造成重复。要小心此副作用。

4 Http物理结构

1)proxy

client和server的中间人。 代理的两端的网络协议相同。比如都是http。网关则是协议转换器,比如http request经过网关转换后发送给ftp server。 proxy作用
内容过滤,比如儿童过滤器 文档访问控制,通过权限认证来控制 安全防火墙,限制哪些应用层协议的数据可以流入或流出一个组织。有的防火墙只允许http数据流入流出。 web缓存,将缓存可以放在proxy上。此proxy与client距离比较近,访问速度远大于server 反向代理,假扮server,称为替代物。它们接收client的request,然后按需发送给不同的web server(重定向,负载均衡) 内容路由器 转码器,将内容发送给client之前,可以修改内容格式。比如将gzip压缩的server传输的数据,进行unzip,再回传给client 匿名者,proxy将request中的身份特性删除,比如from,referer,cookie等。可以提高保密性 proxy与client的连接
浏览器中直接设置代理,此后所有的request直接发送给此proxy 修改网络,也能拦截代理。拦截网络流量,并将其导入到代理中。通常是在交换机或路由器层级做。 修改DNS命名空间,反向代理放在web server之前,它会假扮服务器的ip和名字。这样通过DNS解析后数据就发送给了proxy。(重定向和负载均衡经常使用) 修改web server。让server发送一条重定向response给client,之后client就会将新的request都发送给proxy了。

2) cache

作用
cache访问速度远远快于server。一般cache配置在离client比较近的地方。如学校机房等。 防止server瞬间拥塞 减小距离时延。有时候server距离很远,比如国外的server。连接时延和传输时延就相当大了。 命中
新鲜度检测,称为缓存再验证,看看cache中保存的副本是不是server上最新的 cache只有在文件过期后,才会做再验证 再验证request:If-modified-since 再验证response
如果再验证发现没有被修改,则server回复304 not modified,称为再验证命中。 再验证未命中,server会将新的文档发送回来,并回复200 ok 在验证,对象被删除,回复404 not found 判断文档是否来自cache:查看Date首部,与当前时间比较。如果Date比较早,那就肯定是cache中的 缓存处理步骤
接收client的报文 解析request报文中的URL和各种header 查询是否有本地副本可用 新鲜度检测,如果文档过期了,发送if-modified-since来检测文档新鲜度 创建response,利用新的header和已缓存的文档创建response。注意不要调整Date首部,它表示的文档最开始创建的时间。 发送response到client 文档过期
server向每个文档添加一个过期日期,通过expires首部和cache-control首部 Expires在http1.0中使用,使用绝对时间。缺点是client和server很有可能时间不同步 cache-control:max-age在http1.1中使用,使用相对时间,即报文response到过期之间的时间。 喎?http:>