计算机网络--应用层

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(回应的内容为新的文件的全部数据)