Http协议简介
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报文结构
起始行 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:>