强烈推荐《计算机网络-自顶向下方法》这本书,由浅入深的讲解计算机网络的基础知识。本系列为对此书的学习总结。
计算机网络模型
在两个不同端系统上的进程,通过跨越计算机网络的交换报文而相互通信。网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。在一对进程之间的通信会话场景中,发起通信的进程被标识为客户端,而会话开始时等待连接的进程是服务器。
应用层
网络的核心设备并不在应用层上起作用,而仅在较低层起作用。特别是在网络及下面层次起作用。
应用层级接口体系
客户-服务器体系结构
有一个总是打开的主机服务器,它服务与来自其他客户端的请求。典型应用如Web应用程序。客户之间不直接通信,服务器具有固定的、周知的地址,并且服务器总是打开的,客户端通过向服务器发送请求来获得响应。常见的如Web、FTP、Telnet和电子邮件。
P2P体系结构
应用程序在间断连接的主机对之间直接通信。这些主机被称为对等方,并不为服务器提供商所有。每个对等方可以是发送者,也可以是接收者。例如迅雷。P2P体系结构具有自扩展性,每个对等方都对请求文件产生工作负载,但是每个对等方通过向其他对等方发送文件也增加了系统服务能力。
许多应用柔和的两个体系,例如在即时讯息应用而言,服务器被用于跟踪用户的IP地址,但用户的报文在用户主机之间直接发送。
多数应用程序是由通信进程对组成的,每对中的两个进程相互发送报文,一个进程向另一个进程(不同计算机)发送的报文必须通过下面的网络。进程通过套接字软件接口向网络发送报文及从网络接受报文。套接字是同一台主机内应用层和网络层之间的接口。由于套接字是建立网络应用的可编程接口,因此套接字也成为应用程序和网络接口之间的应用程序编程接口。
应用层可以控制套接字在应用端的一切,但是对于该套接字的运输层几乎没有控制权。应用层对运输层的控制仅限于: 1.选择运输层协议 2.也许设定几个运输层参数,如最大缓存和最大报文字段长度等。
应用层协议
应用层协议定义了运行在不同的端系统上的应用程序进程如何相互传递报文,具体包括 1.交换的报文类型,例如请求报文和响应报文 2.各种报文类型的语法 3.字段的语义 4.确定一个进程何时以及如何发送报文,对报文响应的规则
HTTP
Web的应用层协议是超文本传输协议(HTTP),它是Web的核心。HTTP定义了Web客户和Web服务器请求Web页面的方式,以及服务器向客户发送Web页面的方式。HTTP是应用层协议,使用TCP作为支撑运输协议。HTTP客户首先发起与服务器的TCP连接,一旦建立连接,就可以通过套接字接口访问TCP,一旦向套接字接口发送请求报文,该报文就脱离应用层控制并进入TCP控制。
TCP能为HTTP提供可靠的数据传输服务,意味着每个发出的HTTP请求最后都能完成的到达。HTTP协议不用担心数据丢失,也不关注TCP从网络的数据丢失和乱序故障中恢复的细节。
HTTP是一种不保存状态,即无状态(stateless)协议,HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。但是服务器可以将通过HTTP传输的数据保存下来,比如Session。
HTTP报文格式
请求报文与响应报文
请求行:包含用于请求的方法,请求URI和HTTP版本。 状态行:包含表明响应结果的状态码,原因短语和HTTP版本 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。 其他:可能包含HTTP的RFC里未定义的首部(Cookie等)
请求报文 请求报文分为:报文首部(请求行+首部行)、空行、请求实体。也能说是请求行+请求头+空行+请求体。表达不同,记住上面的图即可。
请求行 请求行有三个字段:方法字段、URL字段和HTTP版本字段
方法字段包括GET/POST/HEAD/PUT/DELETE/OPTIONS/TRACE,表示请求的动作。 URL是请求的地址。 HTTP表示使用的HTTP版本。
请求方法: GET:获取资源,GET方法用来请求访问已被URI识别的资源。 POST:传输实体主体。 HEAD:获得报文首部。HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。 PUT:传输文件。PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。 DELETE:删除文件。DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。 OPTIONS:询问支持的方法,OPTIONS方法用来查询针对请求URI指定的资源支持的方法。 TRACE:追踪路径,TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。 CONNECT:要求用隧道协议连接代理,CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(TransportLayer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
在HTTP1.1版本中,PUT和DELETE自身不带验证机制,任何人都可以上传和删除,所以一般不会开启。常用的有GET/POST/HEAD/OPTIONS等等,GET最常用。
首部行
首部行分为通用首部、请求首部、响应首部、实体首部。其中请求首部只在请求报文,响应首部只在响应报文。通用首部和实体首部请求和响应都可以。首部后的其他字段用来扩展,可以
通用首部
通用首部字段是指,请求报文和响应报文双方都会使用的首部。 Cache-Control:通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。 Connection:控制不再转发给代理的首部字段(在客户端发送请求和服务器返回响应内,使用Connection首部字段,可控制不再转发给代理的首部字段),管理持久连接(1.1以后默认持久连接,当服务器端想明确断开连接时,则指定Connection首部字段的值为Close)。 Date:首部字段Date表明创建HTTP报文的日期和时间。 Pragma:Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。 但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。 Trailer:首部字段Trailer会事先说明在报文主体后记录了哪些首部字段 Transfer-Encoding:首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。 Upgrade:首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。 Via:使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径 Warning:该首部通常会告知用户一些与缓存相关的问题的警告
请求首部
Accept:通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级(范围0-1),当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。 Accept-Charset:可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序 Accept-Encoding:Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序 Accept-Language:用来告知服务器用户代理能够处理的自然语言集用来告知服务器用户代理能够处理的自然语言集 Authorization:用来告知服务器,用户代理的认证信息(证书值) Expect:告知服务器,期望出现的某种特定行为。HTTP/1.1规范只定义了100-continue,等待状态码100响应的客户端在发生请求时,需要指定Expect:100-continue。 From:首部字段From用来告知服务器使用用户代理的用户的电子邮件地址 Host:请求的资源所处的互联网主机名和端口号。首部字段Host和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这是首部字段Host必须存在的意义。 If-Match:形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。服务器会比对If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求 If-Modified-Since:它会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304Not Modified的响应。 If-None-Match:它和首部字段If-Match作用相反。用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求。 If-Range:它告知服务器若指定的If-Range字段值(ETag值或者时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。 Referer:首部字段Referer会告知服务器请求的原始资源的URI。 Range:对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围
响应报文 响应报文和请求报文的格式类似,只不过第一行变成了状态行。响应报文由报文首部(状态行+首部字段)、空行、报文主体所组成。
状态行 状态行由HTTP版本,状态码和状态代码的文本描述组成。
状态码:
2XX:成功 200: OK。表示从客户端发来的请求在服务器端被正常处理了。GET方法对应请求资源的实体会作为响应返回,使用HEAD方法时,对应请求资源的实体主体不随报文首部作为响应返回。 204:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
3XX:重定向。3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求 301:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。 302:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。 303:该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源 304:和重定向没有关系,表示客户端发送附带条件的请求[插图]时,服务器端允许请求访问资源,但因发生请求未满足条件。
4XX:4XX的响应结果表明客户端是发生错误的原因所在。 400:该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求 401:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。 403:该状态码表明对请求资源的访问被服务器拒绝了 404:该状态码表明服务器上无法找到请求的资源
5XX:5XX的响应结果表明服务器本身发生错误 500:该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。 503:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
响应首部
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。 Accept-Ranges:首部字段Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。 Age:首部字段Age能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。代理创建响应时必须加上首部字段Age ETag:首部字段ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值 Location:使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx:Redirection的响应,提供重定向的URI。 Proxy-Authenticate:首部字段Proxy-Authenticate会把由代理服务器所要求的认证信息发送给客户端
实体首部 Allow:首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。 Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式 Content-Language:实体主体使用的自然语言 Content-Length:表明了实体主体部分的大小 Content-Location:给出与报文主体部分相对应的URI Content-MD5:一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。 Content-Range:针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求 Content-Type:实体主体内对象的媒体类型 Expires:首部字段Expires会将资源失效的日期告知客户端。 Last-Modified:首部字段Last-Modified指明资源最终修改的时间。 属于Cookie的首部 HTTPS HTTP有以下的缺点: ●通信使用明文(不加密),内容可能会被窃听 ●不验证通信方的身份,因此有可能遭遇伪装 ●无法证明报文的完整性,所以有可能已遭篡改 HTTP加上加密处理和认证以及完整性保护后即是HTTPS(HTTP Secure)。HTTPS并不是一种新的协议,只是由原来的TCP转变为了SSL(Secure Socket Layer)或者TLS(Transport Layer Security)。
当然HTTPS也是有代价的。首先对报文加密会增加额外的处理器和内存负担,而认证的证书需要权威机构颁发(这个是需要花钱的),保证报文的完整性,防止篡改需要在报文后加上MAC,增加了传输量。还有就是通信时间慢,SSL比TCP多了一些步骤,这些都需要时间。SSL是属于TCP的加强版,同样是传输层协议。
HTTP1.0/1.1/2.0的区别:
暂时为此,以后再更
DNS
DNS采用UDP传输。
DNS可以指: 1.由一个分层的DNS服务器实现的分布式数据库 2.一个使的主机能够查询分布式数据库的应用层协议
DNS分布式数据库
根DNS服务器:根域名服务器管理顶级域名服务器的IP地址。有400多个根域名服务器在全世界,由13个不同组织管理。 顶级域DNS服务器:顶级域名服务器管理权威域名服务器的IP地址。com/org/net/edu/gov等等顶级域都有顶级域名服务器。 权威DNS服务器: 本地DNS服务器:每个ISP都有一台本地DNS服务器,主机的本地DNS服务器通常邻近主机。本地DNS服务器起着代理的作用,同时也缓存查询的信息。
先去本地DNS服务器查询,查看是否有缓存,如果有则直接返回。如果没有,则去根DNS->顶级域DNS-》权威DNS。查询得到结果后本地DNS服务器将结果缓存,并将结果返回给主机。因为本地DNS是采用迭代查询,顶级域DNS基本都被缓存了,所以绝大多数并不需要请求根DNS。
递归查询:一般主机和本地DNS是递归查询。本地DNS接受请求后,进行处理,最后返回给主机。递归查询就是一个请求,一个返回,中间的处理由本地DNS完成。 迭代查询:本地DNS和根DNS、顶级域DNS、权威DNS一般都是迭代查询。本地DNS向根DNS发送请求,根DNS返回顶级域DNS地址,然后本地DNS再去请求顶级域,顶级域返回权威DNS地址,本地DNS再去查询权威DNS最后得到结果。
DNS的功能: 进行主机名到IP地址的转换 获得主机别名对应的规范主机名以及主机的IP地址 负载均衡
DNS记录和报文 DNS服务器都会存储资源记录,资源记录是包含四个字段(Name,Value,Type,TTL) TTL是该条资源记录的生存时间,决定资源记录从缓存中删除的时间。 根据Type不同,Name和Value的含义不同 Type为A: Name是主机名 Value是该主机对应的IP地址 Type为NS:Name是域,Value是获得该域中主机IP地址的权威服务器的主机名 Type为CNAME:Name是主机名,Value是Name的主机对应的规范主机名 Type为MX:Value是个别名为Name的邮件服务器的规范主机名
DNS报文:DNS查询报文和请求报文有相同的格式 首部区域: 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。 标志:DNS 报文中的标志字段。比如查询还是回答,是否请求权威DNS,是否递归查询,是否支持递归等等。 问题计数:DNS 查询请求的数目。 回答资源记录数:DNS 响应的数目。 权威名称服务器计数:权威名称服务器的数目。 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。 问题区域 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。 查询类:地址类型,通常为互联网地址,值为 1。
资源记录部分 域名:DNS 请求的域名。 类型:资源记录的类型,与问题部分中的查询类型值是一样的。 类:地址类型,与问题部分中的查询类值是一样的。 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。 资源数据长度:资源数据的长度。 资源数据:表示按查询段要求返回的相关资源记录的数据。
其他应用层协议: SMTP:简单邮件传输协议。SMTP使用TCP来传送数据。 POP3:第三版邮局协议 IMAP:因特网邮件访问协议
|