HOST:表示服务器主机的地址和端口
URL上已经有HOST了,这里的Host和URL中的ip地址和端口,绝大多数情况下是一样的,少数情况可能不同。
Content-Length:表示body中的数据长度
可以通过这个长度来处理粘包问题,HTTP底层也是基于TCP,连续传输多个HTTP数据报,此时接收方这边的接收缓冲区里就会积累多个包的数据,应用程序在读取这些数据的时候就需要明确包之间的边界。
如果没有body的请求/响应,直接使用空行作为分隔符了。
如果有body,空行就不是结束标记了,从空行开始读body,body要读多长就取决于Content-Length,读完之后,这个包就结束了。
Content-Type:表示请求的body中的数据格式
body可以传输很多格式的数据,包括程序员也可以自己约定任意的格式。但是有些格式是非常常见的。
请求中:
1)application/json:body就是json
2)application/x-www-form-urlencoded:称为form表单,通过HTML中的form标签构造出来的一种格式,这个格式的特点就是把query string放到body里了(也可以上传文件)
3)multipart/form-data:上传文件时使用。
响应中:
1)text-plain:纯文本
2)text/html:HTML
3)text/css:css
4)application/javascript:js
5)application/json
6)image/jpg
7)image/png
由于浏览器和服务器之间要进行多次网络交互,整体的过程是比较低效的,为了提升效率,就会把一些固定不变的内容在浏览器本地的机器硬盘上进行缓存。(css,图片,js)
保存到硬盘上之后,后续再请求,就可以直接从硬盘上读取数据,减少了网络交互的开销。使用ctrl+F5强制刷新,就可以不读取缓存,直接读取服务器数据了。
正常来说,响应都有Content-Type,只要有body。
实际上,如果响应确实没有Content-Type,也没有body,有的浏览器(例如chrome)能猜。浏览器的容错能力很强的程序,即使返回的数据有问题,也能尽可能正确的显示出来。(鲁棒性)
User-Argent(简称UA)
User-Argent:操作系统信息+浏览器信息 => 描述了用户使用怎么样的设备上网
在之前,UA是非常关键的部分,不同用户使用的上网设备,差异很大。
同一时间段内,新旧会同时出现。同一时刻,这些浏览器都会存在于市场上。
1)最老的浏览器只能显示文本 2)之后能显示图片 3)能支持js 4)支持flash.....
如果写一个网站使用了新特性,老的设备就无法打开,不使用,则这个网站比不过竞争对手。
借助UA就能解决上述问题:服务器可以针对此时的UA进行判断。
如果用户使用的是很老的设备,返回的页面就不包含新特性,确保这个页面能够正常访问;
如果用户用的是新设备,返回的页面就包含新特性,确保用户体验。
UA里包含了系统信息,就可以判定系统是PC的系统还是移动端的系统,此时就可以根据这个信息来返回不同的页面了。
使用手机浏览器的时候,很多的手机浏览器都有一个功能,手动修改UA,就能访问电脑版的网页了。
一方面,平板这样的设备,虽然小,但是是宽屏,不能和PC/手机划为一类。另一方面,给PC维护一套,手机另一套,太麻烦。
响应式布局(前端提出的解决方案)
通过一套代码,适应不同尺寸的显示器。
css3提供了一个特性“媒体查询”:可以感知到当前屏幕的尺寸,根据尺寸应用不同样式
现在已有越来越多的网站不再依赖UA进行区分了。
Referer:描述了当前这个页面从哪里来的
浏览器中,直接输入url/点击收藏夹打开的网页,是没有referer的。
搜索广告中,都是按照点击收费的。
用户每次点击广告,搜索软件都能赚钱。必然要记录某个广告在某个时间段内被点击多少次。
双方都要统计:1)广告商:服务器上记录日志:百度,搜狗,谷歌.... => 哪些请求是对应的搜索软件引流的。 => 借助referer即可
2)搜索软件:点击会先把请求发到自己的服务器,记录日志就知道了。
referer会被篡改:
1)有动机
2)有能力:运营商提供了通信设施,在路由器/交换机上部署程序,让程序解析HTTP数据,把referer改成自己的就好了。