计算机网络--应用层
DNS
- 计算机(ip地址)下正在通信的应用进程会得到一个端口号
- DNS产生原因:
IP地址难于记忆,可使用符号地址,比如用www.hh.edu表示210.28.39.92。网络本身是使用IP地址的,因此需要一个完成二者之间相互转化的机制。因此就产生的域名系统DNS。 - DNS:将域名解析成IP
- 域名
- 完整的域名最长255个字符
- 每部分最长63个字符
- 不区分大小写
注:mail.163.com:这个是主机名(网站名),由服务器名+域名组成
- 域名服务器
- 根域名服务器:在因特网上共有13个不同IP地址的根域名服务器,他们的名字是用一个英文字母命名,从a一直到m(每个域名服务器都知道所有的顶级域名服务器的域名和IP地址)
- 顶级域名服务器
- 权限域名服务器(负责一个区的域名服务器)
当一个权限域名服务器还不能给出最后的查询答案时,就会告诉发出查询请求的DNS客户,下一步应当找哪一个权限域名服务器 - 本地域名服务器(默认域名服务器)
- 域名解析的过程:
计算机会把已经解析完成的IP缓存到本地(同样DNS服务器中也有缓存)
根域名就是.
顶级域名分为三类:国际顶级域名,通用顶级域名(com,…),基础结构域名(arpa 反向域)。- 迭代查询
- 迭代查询
- 主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他跟域名服务器继续发出查询请求报文。
- 本地域名服务器向跟域名服务器的查询通常是采用的迭代查询。当跟域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:你的下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询。
URL
http://www.joes-hardware.com/seasonal/index-fall.html.
分为三个部分:
- 第一部分是URL所使用的协议Http,方案可以告知web客户端怎样访问资源
- 第二部分是服务的位置即资源位于何处(www.joes-hardware.com)
- 第三部分是资源路径,说明请求的是服务器上拿个特定的本地资源(/seasonal/index-fall.html)
通用格式
< scheme >://< user >:< password >@< host >:< port >/ < path > ; < patrams > ? | < query >#< frag > ]
- 方案(scheme):访问服务器以获取资源时要使用哪种协议
- 用户(user):某些方案访问资源时需要的用户名
- 密码(password):用户名后面可能要包含的密码
- 主机(host):资源宿主服务器的主机名(有时称为域名)或者ip地址
- 端口(port):资源宿主服务器正在监听的端口号。很多方案都有默认的端口号(http:80)
- 路径(path):服务器上资源的本地名,由一个斜杠将其与前面的URL组件分割开。路径组件的语法是和方案有关的
- 参数(patrams):某些方案会用这个组件来指定输入参数,参数为名/值对。URL可以包含多个参数字段,他们之间以及路径其余部分用分号分隔
- 查询(query):某些方案会用这个组件传递参数以**应用程序。查询组件内容没有通用格式。用字符‘?’将其与其他部分分割出来
- 片段(frag):一小片或者一部分资源的名字。引用对象是,不会将frag字段传送给服务器,这个字段是在客户端内部使用的。通过字符‘#’将其与URL的其余部分分割开。
url常见的方案
- http:超文本传输协议,与通用的URL格式相符(除了没有用户名和密码之外)。若省略了端口,则默认是80。
- https:与http是一对。区别在于https使用了SSL(SSL为HTTP连接提供了端到端的加密机制),语法和HTTP的相同,默认端口是443
- mailto:URL指向E-mail地址
- ftp:文件传输协议URL可从FTP服务器上下载或上传文件,并获取FTP服务器上的目录结构内容的列表
- rtsp,rtspu: RTSP URL是可以通过实时流传输协议(Real Time Streaming Protocol)解析的音/视频媒体资源的标识符
- file:表示一台主机上可直接访问的文件
- telnet:用于访问交互式业务
GET和POST的区别
定义
GET:请求服务器发送某个资源
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
差别
- POST相对来说更安全些(不会作为URL的一部分,不会缓存保存在服务器日志 以及浏览记录中),post传递的表单值是隐藏到http报文体中,url中看不到。get提交数据还可能会造成CSRF攻击; POST也不能收藏书签
- POST发送的数据更大(get有URL长度限制,POST没有)
- POST能发送更多的数据类型(get只能发送ASCLL字符)
- POST比GET慢
- POST用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据,不会改变原有数据
- 虽然GET可以带request body,也不能保证一定能被接收到
POST慢的原因
- POST需要在请求的Body部分包含数据,所以会多几个数据描述部分的首部字段(如content-type),但这部分微乎其微。
- 最重要的是POST请求过程比GET请求多了一次请求,POST在请求时,会先发送请求头,服务器确认之后,才会发送真正的数据。(GET产生一个TCP数据包;POST产生两个TCP数据包,根据浏览器而定的,firefox浏览器就只会发送一次)
- get会将数据缓存起来,所以get请求可以享受到各种缓存机制,而post不会
- post不能进行管道化传输
GET请求URL最大长度限制
- 首先即使get有长度限制,也是限制的整个URL的长度,而不仅仅是参数值数据长度
- 因为浏览器和Web服务器限制了URL的长度(Get 请求,HTTP规范对URL长度是没有限制的)
- 不同的浏览器和服务器限制的长度不同(IE 2083字节, Chrome 8182字节)
- 超出了最大长度,大部分的服务器直接截断
详细内容
HTTP实现断点续传
简述
指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。
相关参数
从HTTP1.1开始后,开始支持获取文件部分内容,为并行下载以及断点续传提供了技术支持。
客户端发请求对应的请求头是Range,服务器端响应时对应的响应头是Content_Range
Range
指定第一个字节的位置和最后一个字节的位置
Range:bytes=0-499
表示最后500个字节:bytes=-500
Content_Range
服务器会在Content_Range头部返回当前接受的范围和文件总大小
Content_Range:bytes 0-499/22400
返回的响应头内容
- HTTP/1.1 200 Ok(不使用断点续传方式)
- HTTP/1.1 206 Partial Content(使用断点续传方式)
增强校验
在终端发起续传请求时,URL 对应的文件内容在服务器端已经发生变化,此时续传的数据肯定是错误的。
Last-Modified
RFC2616中定义。
If-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
ETag
FC2616中定义,放置文件的唯一标识。由服务器端生成。当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: “3f80f-1b6-3e1cb03b” 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较。
主要为了解决 Last-Modified 无法解决的一些问题。
1.一些文件也许会周期性的更改,但是内容并不改变(仅改变修改时间),这时候我们并不希望客户端认为这个文件被修改了,而重新 GET。
2.某些文件修改非常频繁,例如:在秒以下的时间内进行修改(1s 内修改了 N 次),If-Modified-Since 能检查到的粒度是 s 级的,这种修改无法判断(或者说 UNIX 记录 MTIME 只能精确到秒)。
3.某些服务器不能精确的得到文件的最后修改时间。
Etag 仅仅是一个和文件相关的标记,可以是一个版本标记,
If-Range
If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。
用于判断实体是否发生改变,如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体
一般格式:If-Range: Etag | HTTP-Date
If-Range 必须与 Range 配套使用。如果请求报文中没有 Range,那么 If-Range 就会被忽略。如果服务器不支持 If-Range,那么 Range 也会被忽略。
请求文件流程
第一次请求:
- 客户端发起GET请求一个文件
- 服务器处理请求,返回文件内容及相应的Header(包括ETag),假设服务器支持ETag生成并已开启,状态码为200
第二次请求(断点续传):
- 客户端发起GET请求一个文件,同时发送If-Range(内容就是第一次请求时服务器返回的ETag)
- 服务器判断接收到的ETag和计算出的ETag是否匹配,匹配的话响应的状态码就是206,否则为200(回应的内容为新的文件的全部数据)