应用层
网络是计算机网络存在的理由。没有构想出有用的应用,也就没有必要去设计支持它们的网络协议。
因特网应用包括:
- 20世纪70年代与80年代,经典的基于文本的应用。
- 20世纪90年代中期,万维网。
- 20世纪末,即时讯息和对等(P2P)文件共享。
- 2000年以来,新型的视频会议,IP电话,多方在线游戏等
应用层内容:
- 应用程序所需要的网络服务
- 客户
- 服务器
- 进程
- 运输层接口
应用层协议原理
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
两个经典例子
-
web应用:
-
运行在用户主机(电脑,手机,平板等都算)上浏览器程序。
-
运行在web服务器主机上的web服务器程序。
-
-
P2P应用(下边有P2P的介绍):
- 参与共享的每台主机都有一个程序
网络应用程序体系结构
特别注明:网络应用程序体系结构与网络体系结构两者不是一回事
前者仅限于应用,后者是网络的七层模型,四层模型等。换句话说,前者只是后者应用层的部分。
两种体系结构
-
客户-服务器体系结构
-
这是目前最常见的结构。一个是服务器端,一个是用户端。
-
特征
- 客户与客户之间不直接通信,永远通过服务器进行通信。(如:A发消息给B,A将消息发送到服务器,服务器转发到B)。
- 服务器永远固定的,周知的地址,改地址被称为IP地址。(其实是让用户永远找得到服务器,然后他的一切操作围绕服务器进行)
-
问题
-
当用户达到一定的数量时,服务器会跟不上需求。容易随着用户的数量增大,性能出现断崖式下跌。
为此,常常配备大量主机的数据中心常常被用于创建虚拟服务器。
-
-
-
P2P体系结构
- 对位于数据中心的专用服务器有最小的(甚至能没有)依赖。
- 特征
- 主机之间直接通信。通信双方被称为对等体。
- 优势
- 自扩展性(每多一个用户,也多了一个服务器。新的用户接受服务的同时,也提供服务)
- 缺点
- 面临着高度非集中式结构,安全性,性能,可靠性等多方面的挑战。
-
混合体系结构(感觉哪都有这种货色,比如:原生安卓APP与H5APP中间整出来一个混合式的,两者的好处都取用一下)
- 结合客户-服务器和P2P的元素。
进程通信
在操作系统中,进行通信的是进程而不是程序本身。
程序是死的,然后运行起来的程序一般成为进程。
- 运行在相同端系统上的程序之间通信使用进程间通信机制互相通信。
- 运行在不同端系统上的程序通过计算机网络交换报文通信。
客户与服务器进程
网络应用程序由成对的进程组成,这些进程之间互相发送报文。二者一个被标识为客户,一个被标识为服务器。一般发起通信的进程被称为客户,在会话开始前等待联系的是服务器。
进程与计算机网络之间的接口
多数应用程序由通信进程对组成,每对中的两个进程互相发送报文。从一个进程往另一个进程发送报文必须通过应用层以下的网络。一般通过一个被称为套接字的软件接口向下层网络中发送报文或从下层网路接受报文。
套接字也称为应用程序和网络之间的应用程序编程接口(应用程序编程接口简称API)。套接字可以理解成一个函数,只能控制一端,另一端只能通过提供几个参数去影响。可以提供的参数包括:选择运输层协议,设定几个如最大缓存等参数。
进程寻址
两个东西:找到目的主机(IP地址),找到目的主机的接受进程(端口号)。
可供应用程序使用的运输层服务
可靠数据传输
就是发送端程序啥样,发送过去之后依旧啥样。
要求不丢失,不乱序,不重复,不出错
运输层协议可以保证可靠数据传输
吞吐量
就是发送进程能够向接受进程交付比特的速率。(就是每秒能发送多少比特)
对于具有吞吐量要求的应用程序称为宽带敏感引用。没有要求的被称为弹性应用。
定时
运输层协议能保证定时。
其实就是,不能有延迟,一些东西必须立马传输到客户端。(挑战打游戏,数据晚传输过来1秒,能被杀死几回)
安全性
因特网的运输层协议
一共两个,TCP协议,UDP协议。
TCP服务
包括面向连接服务和可靠数据传输服务。
- 面向连接服务:在双方应用层报文开始交换之前,TCP之间先让客户与服务器互相交换运输层控制信息(速成握手)。
- 可靠数据传输服务:不缺失,不失序,不重复,不错误。
TCP还有拥塞机制。就是当传输过程中,发现网络拥塞,就会抑制发送进程。该机制对单个应用未必有大作用,对整体因特网又说有巨大的好处。(相当于出门送打饭,发现食堂有点人多,那就等会再去)
UDP服务
仅提供最小的服务。没有拥塞机制,而且只管发送不管能不能被接受(经典情景,打电话的时候,一边卡了,这边一直在嗷嗷喊,为啥不说话,那边没音,因为收不到)
因特网运输层协议不提供的服务
对于吞吐量与定时,运输层协议没有直接提供。需要应用层自己想办法限制。
应用层协议
应用层协议定义了运行在不同端系统的应用进程如何互相传递报文。
- 交换的报文类型。
- 各种报文类型的语法
- 字段的语义
- 确定一个进程何时以及如何发送报文,对报文进行相应的规则。
有些协议由RFC文档定义,位于公共域中。更多的是不公开的。
应用层协议只是网络应用的一小部分。如web应用,常常包含,文档格式的标准(即HTML)、Web浏览器、Web服务器以及一个应用层协议。
Web与HTTP
HTTP概况
Web的应用层协议是超文本传输协议(即HTTP)
HTTP由两个程序实现:一个客户程序和一个服务器程序。
Web页面(也叫文档)是由对象组成的。一个对象只是一个文件。多数的Web页面都是由一个HTML基本文件与几个引用对象组成的。
HTTP采用TCP作为它的支撑运输层协议。所以http可以保证可靠数据传输。
HTTP是无状态协议。(说白了就是,鱼的记忆还有7秒,它的记忆就是0秒,访问完第二次就不认识你是谁了)
非持续连接与持续连接
客户-服务器的交互是需要经过TCP连接发送的。
非持续连接就是,每个请求都建立一个新的TCP连接。举个例子,你请求回来了一个html文档,但是html中引入了两张图片。此时请求完html文档之后直接就断开TCP,然后重新建立TCP去请求图片。总共建立了3个TCP。
众所周知,TCP的建立销毁很消耗资源的。
持续连接是则可以等两张图片也传输过来了才关闭TCP。
HTTP1.1默认是持续连接。
请求报文
示例:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fir
该报文是ASCII文本书写
第一行为请求行,包括三个部分:方法字段,URL字段,HTTP版本字段。
- 常见的方法字段
- GET
- HEAD
- POST
- PUT
- DELETE
- URL字段
- 请求对象的标识。(感觉在Java开发中,@RequestMapper中设置的请求地址)
- 版本信息
- 如HTTP/1.0,HTTP/1.1等
后继的行叫作首部行
-
首部行Host: 指明对象所在的主机(其实就是域名、ip地址之类的)
该首部行提供的信息是Web代理高速缓存所要求的
-
Connection: 确定持续连接还是非持续。
-
User-agent: 确定浏览器的类型(我用过的一个用途是,对于不同浏览器发送不同的页面,比如ie浏览器比较古老,好多新技术如vue无法使用,可以通过这个使用不同的技术)
-
Accept-language: 使用的语言,实例中的为法语
-
还有众多内容协商首部
-
对于首部行,可以自己定义,根据具体情况,自行定义内部首部行
不同方法字段
-
使用GET方法时,实体为空
因为GET请求时,数据都在URL中,浏览器等对URL的处理能力有限,所以数据大小有限制。
-
使用POST的时候,实体可以不为空
-
HEAD方法类似GET方法,但是不返回请求对象,只返回一个响应,常常用于调试追踪。
-
PUT方法一般用过需要向Web服务器上传对象的应用程序使用
-
DELETE方法允许用户或应用程序删除Web服务器上的对象
补充Restful
RESTful API 是应用程序接口 (API) 的一种架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于 GET、PUT、POST 和 DELETE 数据类型,这些数据类型是指有关资源的操作的读取、更新、创建和删除。
- URL即资源,使用名词表示资源
- 接口应直观、简洁、风格命名保持一致
- 必须版本化,具有足够的灵活性来支持上层UI
- 使用名词表示资源,使用HTTP Method 描述操作
- 名词统一使用单数
- 使用小写字母,多个单词用"-"分隔,提高URL的可读性
- 资源嵌套层次避免过深,尽量不超过2层
HTTP协议提供了四种Method:GET
、POST
、PUT
、DELETE
,可用于描述对资源的CRUD操作。
HTTP Method(Verb) | CRUD操作 | 说明 | 幂等性 | 安全性 |
---|---|---|---|---|
GET | Read/Select | 检索资源 | 幂等 | 安全 |
POST | Create | 新建一个资源 | 幂等 | 安全 |
PUT | Update | 更新资源属性 | 幂等 | 安全 |
DELETE | Delete | 删除资源 | 幂等 | 安全 |
响应报文
示例:
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
第一行为状态行
-
协议版本字段
-
状态码
常见状态码 200 请求成功 301 请求对象已经被永久转移了,新的URL定义在响应报文的Location: 首部行中。(客户软件将自动获取新的URL) 400 一个通过差错代码,指示请求不能被服务器理解(常见于参数格式不对) 404 被请求的文档不在服务器(基本都是URL写错了导致的) 405 Method Not Allowed (常见于你采用的方法,服务器端不支持) 500 服务器端发生错误 505 HTTP Version Not Supported 服务器不支持请求报文使用的HTTP协议版本
-
响应状态信息
200 OK 301 Moved Permanently 400 Bad Request 404 Not Found 405 Method Not Allowed 500 Internet Server Error 505 HTTP Version Not Supported
首部行
-
Connection: 首部行告诉客户,发送完报文后将关闭TCP连接
-
Date: 服务器产生并发送该响应报文的日期和时间
注:该时间不是对象创建或者最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入相应报文,并发送该响应报文的时间
-
Server: 首部行指示该报文的服务器,示例中的为Apache Web服务器(参考请求报文的User-agent)
-
Last-Modifie: 首部行指示对象创建或者最后修改的日期和时间(主要用于网络缓存服务器)
-
Content-Length: 首部行指示了被发送对象中的字节数。
-
Content-Type: 首部行指示了实体体中的对象是什么格式的
text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式 application/xhtml+xml :XHTML格式 application/xml: XML数据格式 application/atom+xml :Atom XML聚合格式 application/json: JSON数据格式 application/pdf:pdf格式 application/msword : Word文档格式 application/octet-stream : 二进制流数据(如常见的文件下载) application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .*( 二进制流,不知道下载文件类型) application/octet-stream .tif image/tiff .001 application/x-001 .301 application/x-301 .323 text/h323 .906 application/x-906 .907 drawing/907 .a11 application/x-a11 .acp audio/x-mei-aac .ai application/postscript .aif audio/aiff .aifc audio/aiff .aiff audio/aiff .anv application/x-anv .asa text/asa .asf video/x-ms-asf .asp text/asp .asx video/x-ms-asf .au audio/basic .avi video/avi .awf application/vnd.adobe.workflow .biz text/xml .bmp application/x-bmp .bot application/x-bot .c4t application/x-c4t .c90 application/x-c90 .cal application/x-cals .cat application/vnd.ms-pki.seccat .cdf application/x-netcdf .cdr application/x-cdr .cel application/x-cel .cer application/x-x509-ca-cert .cg4 application/x-g4 .cgm application/x-cgm .cit application/x-cit .class java/* .cml text/xml .cmp application/x-cmp .cmx application/x-cmx .cot application/x-cot .crl application/pkix-crl .crt application/x-x509-ca-cert .csi application/x-csi .css text/css .cut application/x-cut .dbf application/x-dbf .dbm application/x-dbm .dbx application/x-dbx .dcd text/xml .dcx application/x-dcx .der application/x-x509-ca-cert .dgn application/x-dgn .dib application/x-dib .dll application/x-msdownload .doc application/msword .dot application/msword .drw application/x-drw .dtd text/xml .dwf Model/vnd.dwf .dwf application/x-dwf .dwg application/x-dwg .dxb application/x-dxb .dxf application/x-dxf .edn application/vnd.adobe.edn .emf application/x-emf .eml message/rfc822 .ent text/xml .epi application/x-epi .eps application/x-ps .eps application/postscript .etd application/x-ebx .exe application/x-msdownload .fax image/fax .fdf application/vnd.fdf .fif application/fractals .fo text/xml .frm application/x-frm .g4 application/x-g4 .gbr application/x-gbr . application/x- .gif image/gif .gl2 application/x-gl2 .gp4 application/x-gp4 .hgl application/x-hgl .hmr application/x-hmr .hpg application/x-hpgl .hpl application/x-hpl .hqx application/mac-binhex40 .hrf application/x-hrf .hta application/hta .htc text/x-component .htm text/html .html text/html .htt text/webviewhtml .htx text/html .icb application/x-icb .ico image/x-icon .ico application/x-ico .iff application/x-iff .ig4 application/x-g4 .igs application/x-igs .iii application/x-iphone .img application/x-img .ins application/x-internet-signup .isp application/x-internet-signup .IVF video/x-ivf .java java/* .jfif image/jpeg .jpe image/jpeg .jpe application/x-jpe .jpeg image/jpeg .jpg image/jpeg .jpg application/x-jpg .js application/x-javascript .jsp text/html .la1 audio/x-liquid-file .lar application/x-laplayer-reg .latex application/x-latex .lavs audio/x-liquid-secure .lbm application/x-lbm .lmsff audio/x-la-lms .ls application/x-javascript .ltr application/x-ltr .m1v video/x-mpeg .m2v video/x-mpeg .m3u audio/mpegurl .m4e video/mpeg4 .mac application/x-mac .man application/x-troff-man .math text/xml .mdb application/msaccess .mdb application/x-mdb .mfp application/x-shockwave-flash .mht message/rfc822 .mhtml message/rfc822 .mi application/x-mi .mid audio/mid .midi audio/mid .mil application/x-mil .mml text/xml .mnd audio/x-musicnet-download .mns audio/x-musicnet-stream .mocha application/x-javascript .movie video/x-sgi-movie .mp1 audio/mp1 .mp2 audio/mp2 .mp2v video/mpeg .mp3 audio/mp3 .mp4 video/mpeg4 .mpa video/x-mpg .mpd application/vnd.ms-project .mpe video/x-mpeg .mpeg video/mpg .mpg video/mpg .mpga audio/rn-mpeg .mpp application/vnd.ms-project .mps video/x-mpeg .mpt application/vnd.ms-project .mpv video/mpg .mpv2 video/mpeg .mpw application/vnd.ms-project .mpx application/vnd.ms-project .mtx text/xml .mxp application/x-mmxp .net image/pnetvue .nrf application/x-nrf .nws message/rfc822 .odc text/x-ms-odc .out application/x-out .p10 application/pkcs10 .p12 application/x-pkcs12 .p7b application/x-pkcs7-certificates .p7c application/pkcs7-mime .p7m application/pkcs7-mime .p7r application/x-pkcs7-certreqresp .p7s application/pkcs7-signature .pc5 application/x-pc5 .pci application/x-pci .pcl application/x-pcl .pcx application/x-pcx .pdf application/pdf .pdf application/pdf .pdx application/vnd.adobe.pdx .pfx application/x-pkcs12 .pgl application/x-pgl .pic application/x-pic .pko application/vnd.ms-pki.pko .pl application/x-perl .plg text/html .pls audio/scpls .plt application/x-plt .png image/png .png application/x-png .pot application/vnd.ms-powerpoint .ppa application/vnd.ms-powerpoint .ppm application/x-ppm .pps application/vnd.ms-powerpoint .ppt application/vnd.ms-powerpoint .ppt application/x-ppt .pr application/x-pr .prf application/pics-rules .prn application/x-prn .prt application/x-prt .ps application/x-ps .ps application/postscript .ptn application/x-ptn .pwz application/vnd.ms-powerpoint .r3t text/vnd.rn-realtext3d .ra audio/vnd.rn-realaudio .ram audio/x-pn-realaudio .ras application/x-ras .rat application/rat-file .rdf text/xml .rec application/vnd.rn-recording .red application/x-red .rgb application/x-rgb .rjs application/vnd.rn-realsystem-rjs .rjt application/vnd.rn-realsystem-rjt .rlc application/x-rlc .rle application/x-rle .rm application/vnd.rn-realmedia .rmf application/vnd.adobe.rmf .rmi audio/mid .rmj application/vnd.rn-realsystem-rmj .rmm audio/x-pn-realaudio .rmp application/vnd.rn-rn_music_package .rms application/vnd.rn-realmedia-secure .rmvb application/vnd.rn-realmedia-vbr .rmx application/vnd.rn-realsystem-rmx .rnx application/vnd.rn-realplayer .rp image/vnd.rn-realpix .rpm audio/x-pn-realaudio-plugin .rsml application/vnd.rn-rsml .rt text/vnd.rn-realtext .rtf application/msword .rtf application/x-rtf .rv video/vnd.rn-realvideo .sam application/x-sam .sat application/x-sat .sdp application/sdp .sdw application/x-sdw .sit application/x-stuffit .slb application/x-slb .sld application/x-sld .slk drawing/x-slk .smi application/smil .smil application/smil .smk application/x-smk .snd audio/basic .sol text/plain .sor text/plain .spc application/x-pkcs7-certificates .spl application/futuresplash .spp text/xml .ssm application/streamingmedia .sst application/vnd.ms-pki.certstore .stl application/vnd.ms-pki.stl .stm text/html .sty application/x-sty .svg text/xml .swf application/x-shockwave-flash .tdf application/x-tdf .tg4 application/x-tg4 .tga application/x-tga .tif image/tiff .tif application/x-tif .tiff image/tiff .tld text/xml .top drawing/x-top .torrent application/x-bittorrent .tsd text/xml .txt text/plain .uin application/x-icq .uls text/iuls .vcf text/x-vcard .vda application/x-vda .vdx application/vnd.visio .vml text/xml .vpg application/x-vpeg005 .vsd application/vnd.visio .vsd application/x-vsd .vss application/vnd.visio .vst application/vnd.visio .vst application/x-vst .vsw application/vnd.visio .vsx application/vnd.visio .vtx application/vnd.visio .vxml text/xml .wav audio/wav .wax audio/x-ms-wax .wb1 application/x-wb1 .wb2 application/x-wb2 .wb3 application/x-wb3 .wbmp image/vnd.wap.wbmp .wiz application/msword .wk3 application/x-wk3 .wk4 application/x-wk4 .wkq application/x-wkq .wks application/x-wks .wm video/x-ms-wm .wma audio/x-ms-wma .wmd application/x-ms-wmd .wmf application/x-wmf .wml text/vnd.wap.wml .wmv video/x-ms-wmv .wmx video/x-ms-wmx .wmz application/x-ms-wmz .wp6 application/x-wp6 .wpd application/x-wpd .wpg application/x-wpg .wpl application/vnd.ms-wpl .wq1 application/x-wq1 .wr1 application/x-wr1 .wri application/x-wri .wrk application/x-wrk .ws application/x-ws .ws2 application/x-ws .wsc text/scriptlet .wsdl text/xml .wvx video/x-ms-wvx .xdp application/vnd.adobe.xdp .xdr text/xml .xfd application/vnd.adobe.xfd .xfdf application/vnd.adobe.xfdf .xhtml text/html .xls application/vnd.ms-excel .xls application/x-xls .xlw application/x-xlw .xml text/xml .xpl audio/scpls .xq text/xml .xql text/xml .xquery text/xml .xsd text/xml .xsl text/xml .xslt text/xml .xwd application/x-xwd .x_b application/x-x_b .sis application/vnd.symbian.install .sisx application/vnd.symbian.install .x_t application/x-x_t .ipa application/vnd.iphone .apk application/vnd.android.package-archive .xap application/x-silverlight-app
cookie
一共4个组件:
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理
- 位于Web站点的一个后端数据库
HTTP是无状态连接,第二次访问与第一次访问服务器端是无感的。(鱼的记忆有7秒,这玩意一秒没有,回复完就忘了)
但是对于互联网应用来说,是有有状态的需求的,就现在来说,多少东西需要登录账号啊。(假如说没有这个cookie,我上一个网页跳转一次登一次账号密码,难受)。
cookie可以用于标识一个用户。
Web缓存
也叫做代理服务器
其实就是缓存,这个东西一般安装在特别近的网上,如一个住宅ISP中,可能在网络中就安装了一台或多台Web缓存器。
然后你请求某个东西,比如百度官网,它就会去查看Web存储上有没有,如果有直接给你,没有就去百度的服务器取一份,然后缓存起来,再返回一份。
拿小脚拇指也能想到,Web服务器上传回来的肯定比百度服务器传回来的快啊。百度服务器接收到的请求少了,处理速度也就快了。
两个好处
- 大大减少对客户请求的响应时间。
- Web缓存器能够大大减少一个机构的接入链路到因特网的通信量。
问题
好处有了,但是你怎么确定缓存器上的是最新的。我看个新闻,结果给我返回个100天前的,还看个屁。
此时出现了条件GET方法
- 使用的GET方法
- 请求报文包含一个“If-Modified-Since:”首部行。
其实就是我请求Web缓存器,它带上If-Modified-Since请求百度官网,携带的日期是上次访问时响应报文中Last-Modified的时间,然后百度服务器相应报文中有个Last-Modified: 首部行么?比较一下,如果现在的Last-Modified与上次的还一样不,一样就不返回实体了,Web里边有,不一样就返回实体。
那返回实体的速度与不返回的必然不一样啊,突出一个能节约就节约。
电子邮件
线代电子邮件具有许多强大的特性,包括具有附件,超链接,HTML格式文本和图片的报文。
因特网的电子邮件3个主要组成部分:
-
用户代理
用户代理允许用户阅读、回复、转发、保存、撰写报文。(就是给用户操作的平台)
-
邮件服务器
真正传输邮件的双方。邮件服务器形成了电子邮件体系结构的核心。
每个接收方在其中的某个邮件服务器上有一个邮箱。
从发送方的用户代理开始,传输到发送方的邮箱服务器,在传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。(类比从qq邮箱的web网页中,传输到qq邮箱服务器,然后qq邮箱服务器传输到163邮箱服务器,然后存到属你的账号的那一块)
对于发送方的邮件服务器,可以应付接收方服务器的故障。(qq邮箱发送到163邮箱,此时163那边有点问题宕机了,这个邮件不就这样算了,等会再发送一下看看好了没,等了到了一定时间还没修复,那么就通知一下发送者,有点问题,发送不了)。如果A向B发送没成功,会放到报文队列中。
-
简单邮件传输协议
SMTP是因特网电子邮件中主要的应用层协议。依靠TCP可靠数据传输服务。
SMTP分为两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。
SMTP
SMTP是因特网电子邮件的核心。
因为SMTP年代比较久远,比HTTP还远,所以有一些陈旧的措施,如所有邮件报文的体部分(不只是首部)只能采用简单的7比特ACSII表示。
1) Alice调用她的邮件代理程序并提供Bob的邮件地址(例如bob@someschool.edu),撰写报文,然后指示用户代理发送该报文。
2) Alice的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中。
3) 运行在Alice的邮件服务器上的SMTP客户端发现了报文队列中的这个报文,它就创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接。
4) 在经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送Alice的报文。
5) 在Bob的邮件服务器上,SMTP的服务器端接收该报文。Bob的邮件服务器然后将该报文放入Bob的邮箱中。
6) 在Bob方便的时候,他调用用户代理阅读该报文。
客户SMTP在25号端口建立一个到服务器SMTP的TCP连接。当TCP连接建议之后,会进行握手。
- SMTP客户指示发送方的邮件地址和接收方的邮件地址
- 握手完毕,客户发送报文
SMTP可以依靠TCP提供的可靠数据传输无差错地将邮件投递到接收服务器。
S: 220 hamburger・edu
C: HELO crepes•fr
S: 250 Hello crepes.frf pleased to meet you
C: MAIL FROM: <alice@crepes.fr>
S: 250 alice@crepes.fr ••• Sender ok
C: RCPT TO: <bob@hamburger•edu>
S: 250 bob@hamburger.edu ••• Recipient ok
C: DATA
S: 354 Enter mail, end with "." on a line by itself
C: Do you like ketchup?
C: How about pickles?
C: .
S: 250 Message accepted for delivery
C: QUIT
S: 221 hamburger.edu closing connection
220 代表服务器就绪,之后是欢迎信息
250 代表邮件操作完成
HELO,MAIL FROM,RCPT TO,DATA,CRLF.CRLF以及QUIT等都是SMTP的一些命令。
与HTTP协议的一些异同
同:
- 都用于从一台主机向另一台主机传送文件
- HTTP是从Web服务器向Web客户传送文件
- SMTP从一个邮件服务器向另一个邮件服务器传送文件
- 持续的HTTP和SMTP都采用持续连接
异:
-
HTTP是一个拉协议,TCP连接是想接受文件的机器发起的。
SMTP是一个推协议,TCP是由发送文件的机器发起的。
-
SMTP要求每个报文(包括它们的体)采用7比特ASCII码格式
HTTP数据不受限制
-
HTTP把每个对象封装到它自己的HTTP相应报文中
SMTP把所有的报文对象放在一个报文中
邮件报文格式
一个包含环境信息的首部位于报文体前面。这些环境信息包括在一系列首部行中,这些行由RFC 5322定义。
首部行和该报文的体用空行(即回车换行)进行分隔。
每个首部必须含有一个From:首部行和一个To:首部行;一个首部也许包含一个Subject:首部行以及其他可选的首部行。
这些首部行不同于我们在之前SMTP命令(即使那里包含了某些相同的词汇,如from和to)。那节中的命令是SMTP握手协议的一部分
在报文首部之后,紧接着一个空白行,然后是以ACSII格式表示的报文体
邮件访问协议
这个协议用于,用户代理与邮件服务器之间。
目前流行的包括:第三版的邮局协议(POP3),因特网邮局访问协议(IMAP),HTTP协议。
POP3
建立在110端口
包含三个阶段:
-
特许
用户代理发送用户名和口令,鉴别用户(俗称:登录)
-
事务处理
- 用户取回报文
- 对报文进行做删除标记,取消删除标记,获取统计信息。
-
更新
- 客户端发出quit命令,结束POP3会话
- 删除被标记为删除的报文
事务处理过程中,用户代理发出一些命令
+OK (服务器到客户的数据) 表示命令正确
-ERR 表示前面的命令出现某些差错
事务处理过程中,POP3的用户代理通常被配置为“下载并删除”与“下载并保留”方式。
在用户代理与邮件服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息;特别是记录了哪些用户报文被标记为删除了。然而,POP3服务器并不在POP3会话过程中携带状态信息。会话中不包括状态信息大大简化了 POP3服务的实现。
IMAP
POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法
就是提供了把每个报文与文件夹联系起来的功能,可以移动、创建文件夹。
还提供了远程文件夹中按指定条件查询匹配的邮件。
HTTP
现在好多邮件的用户代理都是网页版(常用的qq邮箱,163邮箱都是),都是网页了,用HTTP很合理。
DNS
主机的一种标识方法是用它的主机名
另一个是使用ip地址进行标识
对于用户来说,主机名更好记。对于路由器来说,ip地址才是真理。
DNS提供的服务
域名系统(DNS)的目的就是主机名到ip地址转换的目录服务。
DNS:
-
一个由分层的DNS服务器实现的分布式数据库。
-
一个使得主机能够查询分布式数据库的应用层协议
通常是运行在BIND软件的UNIX机器。
运行在UDP之上,使用53端口
对于HTTP请求URL www.someschool.edu/index.html页面过程
- 同一台用户主机上运行着DNS应用的客户端
- 浏览器从上述URL中抽取出主机名www.someschool.edu,并将这台主机名传给DNS应用的客户端
- DNS客户端向DNS服务器发送一个包含主机名的请求
- DNS客户最终会收到一份回答报文,其中含有对应于该主机名的ip地址
- 然后开始http的请求
DNS还提供一些重要的服务
-
主机名 有着负责主机名的主机能拥有一个或者多个别名
应用程序可以调用DNS来获取主机别名对应的规范主机名以及主机的IP地址
-
邮件服务器别名
电子邮件应用程序可以调用DNS,对提供的主机名别名进行解析,以获得该主机的规范主机名及其IP地址。
MX记录(参见后面)允许一个公司的邮件服务器和Web服务器使用相同(别名化的)的主机名
-
负载分配
可以参考Nginx的负载均衡,虽然请求的是一个东西,但是别分散到了不同的地方处理。
多个邮件服务器可以具有相同的别名
DNS工作机理
在用户主机上的某些应用程序需要将主机名转换为IP地址(需要使用IP地址但是只知道主机名、域名)
这些应用程序将调用DNS的客户端,并指明需要被转换的主机名(调用本地的DNS客户,把主机名给他)
用户主机上的DNS接收到后,向网络中发送一个DNS查询报文。所有的DNS请求和回答报文使用UDP数据报经端口 53发送(通过UDP的53接口,发送请求DNS服务器)
经过若干毫秒到若干秒的时延后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文(得到一个IP映射)
从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子
因为因特网数量太大,而且逐步增长,集中式DNS有不妥之处
-
单点故障
一个报错,全家完蛋
-
通信容量
单个DNS再厉害也有上限。
-
远距离的集中式数据库
一个中国的请求,然后DNS在美国,这直接崩溃
-
维护
维护不方便
分布式、层次数据库
3种类型的DNS服务器:
-
根DNS服务器
有400多个根名字服务器
由13个不同的组织管理
可以在[Root Servers 2016]中找到
根名字服务器提供TLD服务器的IP地址
-
顶级域DNS服务器
[TLD list 2016]可以查看
TLD服务器提供了权威DNS服务器的IP地址
-
权威DNS服务器
在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址
还有另一类重要的DNS服务器,称为本地DNS服务器。
每个ISP都有一台本地DNS服务器(也叫默认名字服务器)。本地DNS服务器可能就与主机在同一个局域网中;对于某居民区ISP来说,本地DNS服务器通常与主机相隔不超过几台路由器。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中
从本地DNS到根DNS服务器,到TLD DNS服务器到权威DNS服务器的过程,可以利用递归查询与迭代查询两种(类似转发与重定向)
DNS缓存
在本地DNS服务器->根DNS服务器->TLD DNS服务器->权威DNS服务器 的每一步,都可以进行缓存,下次访问能够简单。
DNS服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。
因为缓存,除了少数DNS查询以外,根服务器被绕过了
DNS记录和报文
共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record,RR)。RR提供了主机名到IP地的映射。每个DNS回答报文包含了一条或多条资源记录。
资源记录是一个包含了下列字段的4元组:
(Name,Valuer,Type,TTL)
如果Type = A,则Name是主机名,Value是该主机名对应的IP地址。
如果Type = NS,则Name是个域(如foo.com),而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
如果Type=CNAME,则Value是别名为Name的主机对应的规范主机名。
如果Type = MX,则Value是个别名为Name的邮件服务器的规范主机名。
如果一台DNS服务器是用于某特定主机名的权威DNS服务器,那么该DNS服务器会有一条包含用于该主机名的类型A记录(不是其权威DNS服务器,它也可能在缓存中包含有一条类型A记录)
不是用于某主机名的权威服务器,那么该服务器将包含一条类型NS记录,该记录对应于包含主机名的域;它还将包括一条类型A记录,该记录提供了在NS记录的Value字段中的DNS服务器的IP地址。
报文
DNS只有这两种报文:查询和回答报文。有着相同的格式
-
前12个字节是首部区域。
第一个字段(标识符)是一个16比特的数,用于标识该查询。
会被复制到对查询的回答报文中标志字段中含有若干标志。
1比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)
1比特的“权威的”标志位被置在回答报文中
1比特的“希望递归”标志位
1比特的“递归可用”标志位置位
4个有关数量的字段指出了在首部后的4类数据区域出现的数量。
-
问题区域包含着正在进行的查询信息。
- 名字字段,包含正在被查询的主机名字;
- 类型字段,指出有关该名字的正被询问的问题类型
-
来自DNS服务器的回答中,回答区域包含了对最初请求的名字的资源记录。
在回答报文的回答区域中可以包含多条RR,因此一个主机名能够有多个IP地址
-
权威区域包含了其他权威服务器的记录
-
附加区域包含了其他有帮助的记录
例如,对于一个MX请求的回答报文的回答区域包含了一条资源记录,该记录提供了邮件服务器的规范主机名。
包含一个类型A记录,该记录提供了用于该邮件服务器的规范主机名的IP地址。
插入数据
注册登记机构是一个商业实体,它验证该域名的唯一性,将该域名输入DNS数据库,对提供的服务收取少量费用。
当你向某些注册登记机构注册域名,需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。
保用于Web服务器的类型A资源记录和用于邮件服务器的类型MX资源记录被输入到权威DNS服务器中。
安全性
针对DNS服务的攻击是分布式拒绝服务(DDos)宽带洪泛攻击
对DNS的潜在更为有效的DDoS攻击将是向顶级域名服务器发送大量的DNS请求。这种攻击的严重性通过本
地DNS服务器中的缓存技术可将部分地被缓解。
在中间人攻击中,攻击者截获来自主机的请求并返回伪造的回答。在DNS毒害攻击中,攻击者向一台DNS服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录。
P2P
从单一服务器向大量主机(称为对等方)分发一个大文件。
在客户-服务器文件分发中,该服务器必须向每个对等方发送该文件的一个副本,即服务器承受了极大的负担,并且消耗了大量的服务器带宽。
在P2P文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器。
2016年止,最为流行的P2P文件分发协议是BitTorrent。
P2P体系结构的扩展性
分发时间(distribution time) 是所有N个对等方得到该文件的副本所需要的时间。
在客户-服务器体系结构中,没有对等方参与来帮助分发文件。
对足够大的N,客户-服务器分发时间由NF/us确定。
- 在分发的开始,只有服务器具有文件。为了使社区的这些对等方得到该文件,该服务器必须经其接入链路至少发送该文件的每个比特一次.
- 与客户-服务器体系结构相同,具有最低下载速率的对等方不能够以小于F/dmin秒的分发时间获得所有F比特。因此最小分发时间至少为F/dmin。
- 观察到系统整体的总上载能力等于服务器的上载速率加上每个单独的对等方的上载速率,即utotal=us+u1+···+uN。系统必须向这N个对等方的每个交付(上载)F比特,因此总共交付NF比特。这不能以快于%也的速率完成。因此,最小的分发时间也至少是NF/(us+u1+···+uN)。
具有P2P体系结构的应用程序能够是自扩展的。这种扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者。
BitTorrent
BitToiTent是一种用于文件分发的流行P2P协议。
用BitTorrent的术语来讲,参与一个特定文件分发的所有对等方的集合被称为一个洪流
在一个洪流中的对等方彼此下载等长度的文件块,典型的块长度为256KB。
每个洪流具有一个基础设施节点,称为追踪器。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中(有点先心跳连接)
一个给定的洪流可能在任何时刻具有数以百计或数以千计的对等方。
当一个新的对等方加入该洪流时,追踪器随机地从参与对等方的集合中选择对等方的一个子集,并将这50个对等方的IP地址发送给它。它持有对等方的这张列表,试图与该列表上的所有对等方创建并行的TCP连接。成功地创建一个TCP连接的对等方为“邻近对等方”。一个对等方的邻近对等方随时间而波动。
两个问题
- 应当从邻居请求哪些块呢
- 应当向哪些请求块的邻居发送块
-
最稀缺优先(rarest Erst):针对她没有的块在她的邻居中决定最稀缺的块(最稀缺的块就是那些在她的邻居中副本数量最少的块),并首先请求那些最稀缺的块。
-
BitTorrent使用了一种机灵的对换算法应对相应的对象
根据当前能够以最高速率向她提供数据的邻居,给出其优先权(谁接受快给谁发送)
每个邻居都持续地测量接收到比特的速率,并确定以最高速率流入的4个邻居
每过10秒,她重新计算该速率并可能修改这4个对等方的集合,这4个对等方被称为疏通(unchoked)
每过30秒,她也要随机地选择另外一个邻居并向其发送块
每过30秒Alice将随机地选择一名新的对换伴侣并开始与那位伴侣进行对换。如果这两名对等方都满足此对换,它们将对方放入其前4位列表中并继续与对方进行对换,直到该对等方之一发现了一个更好的伴侣为止。
-
BitTorrent有一些有趣的机制没有在这里讨论,包括片(小块)、流水线、随机优先选择、残局模型和反怠慢
分布式散列表(DHT)
分布式散列表是一种简单的数据库,其数据库记录分布在一个P2P系统的多个对等方上
视频流
因特网视频
在流式存储视频应用中,基础的媒体是预先录制的视频。(说人话就是,类似B站,腾讯视频这种在线播放,不用下载下来,或者说加载一点播放一点)
视频是一系列的图像,通常以一种恒定的速率(如每秒24或30张图像)来展现
视频的一个重要特征是它能够被压缩,因而可用比特率来权衡视频质量。今天现成的压缩算法能够将一个视频压缩成所希望的任何比特率。当然,比特率越高,图像质量越好,用户的总体视觉感受越好。
从网络的观点看,视频最为突出的特征是它的高比特率。
到目前为止,对流式视频的最为重要的性能度量是平均端到端吞吐量。为了提供连续不断的布局,网络必须为流式应用提供平均吞吐量,这个流式应用至少与压缩视频的比特率一样大。
HTTP流
在HTTP流中,视频只是存储在HTTP服务器中作为一个普通的文件,每个文件有一个特定的URL。
当用户要看该视频时,客户与服务器创建一个TCP连接并发送对该URL的HTTP GET请求。服务器则以底层网络协议和流量条件允许的尽可能快的速率,在一个HTTP响应报文中发送该视频文件。
在客户一侧,字节被收集在客户应用缓存中。一旦该缓存中的字节数量超过预先设定的门限,客户应用程序就开始播放,特别是,流式视频应用程序周期性地从客户应用程序缓存中抓取帧,对这些帧解压缩并且在用户屏幕上展现。因此,流式视频应用接收到视频就进行播放,同时缓存该视频后面部分的帧。
是一遍播放一遍从网上获取。
问题
所有客户接收到相同编码的视频,尽管对不同的客户或者对于相同客户的不同时间而言,客户可用的带宽大小有很大不同。这导致了一种新型基于HTTP的流的研发,它常常被称为经HTTP的动态适应性流(DASH)。
视频编码为几个不同的版本,其中每个版本具有不同的比特率,对应于不同的质量水平。’客户动态地请求来自不同版本且长度为几秒的视频段数据块。当可用带宽量较高时,客户自然地选择来自高速率版本的块;当可用带宽量较低时,客户自然地选择来自低速率版本的块。(感觉就是现在的B站,可以挑选1080,720等不同画质)
DASH允许客户使用不同的以太网接入速率流式播放具有不同编码速率的视频。
每个视频版本存储在HTTP服务器中,每个版本都有一个不同的URL。HTTP服务器也有一个告示文件为每个版本提供了一个URL及其比特率。
客户首先请求该告示文件并且得知各种各样的版本。然后客户通过在HTTP GET请求报文中对每块指定一个URL和一个字节范围,一次选择一块如果客户缓存的视频很多,并且测量的接收带宽较高,它将选择一个高速率的版本。同样,如果客户缓存的视频很少,并且测量的接收带宽较低,它将选择一个低速率的版本。
以上是我自学计算机网络的一点笔记,如有错误请批评指正