计算机网络 2. 应用层 2021-05-22 浏览量 527 暂无评论 [TOC] ## 课程主要内容 - 应用层协议原理 - Web and HTTP - FTP* - Email - SMTP - POP3 - IMAP - DNS - P2P应用 - CDN - TCP套接字(Socket)编程 - UDP套接字编程 ## 2.1 应用层原理 传输层向应用层提供Socket API 应用层的协议最多(因为可以由用户自己实现) ### 客户-服务器(C/S)体系结构 服务器: - 一直运行 - 固定的IP地址和周知的端口号、 - 扩展性:服务器场 - 数据中心进行扩展 - 扩展性差 - 可靠性差 客户端: - 主动与服务器通信 - 可能是动态IP - 不直接与其它客户端通信 ### 对等体(P2P)体系结构 - (几乎)没有一直运行的服务器 - 管理麻烦(维护主机在线状态) ### 混合体 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210509105149908.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### 进程通信 同一主机内,使用进程间通信机制通信(由操作系统定义) 不同主机,通过交换报文(Message)通信 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210509105611311.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 问题1:IP+端口 问题2:来自谁+是什么+给谁 每次传输都要携带如此多的信息,太繁琐易错,可以使用socket简化。 TCP socket:用代号标示通信的双方(4元祖,源IP,源port,目标IP,目标port)(像OS打开文件返回的句柄),本地标示,使得穿过层间的信息减少 UDP socket:用一个整数表示本应用实体的标示(2元祖,本IP,本port),因为前后报文可能给不同的分布式进程 但是传输报文时,必须提供对方IP,port 应用层协议: 定义了运行在不同端系统上的应用进程如何相互交换报文 - 报文类型 - 报文类型的语法 - 语义 - 进程何时、如何发送报文及对报文进行响应的规则 应用协议仅仅是应用的一个组成部分,如Web应用包括:HTTP协议,web客户端,web服务器,HTML ### 传输层提供的服务 TCP服务 - 可靠的传输服务 - 流量控制 - 拥塞控制 - 面向连接 - 不能保证时间、最小吞吐、安全 UDP服务 - 不可靠数据传输 - 没有流量控制、拥塞控制、带宽保证、建立连接 那为什么还有存在的必要呢? - IP提供主机到主机的通信,不能区分进程 - 无需建立连接 - 不可靠,但简单 - 没有那些控制,那可以按设定的速度进行传输 ### 安全性 TCP和UDP都没有加密,铭文通过互联网传输,甚至密码 SSL(安全套接字层),应用采用SSL库,SSL库使用TCP通信 - 在TCP上实现,提供加密的TCP连接 - 私密性 - 数据完整性 - 端到端的鉴别 SSL socket API 应用将明文交给socket,SSL将其加密在互联网上传输 ## 2.2 Web与HTTP ### HTTP概况 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513215627761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) HTTP运行在TCP之上,一个socket监听80号端口的连接,如果收到客户端的请求,则创建一个新的socket与之连接,原来的socket不变,持续监听 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513221232573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### HTTP连接 非持续(四次挥手后关连接) 持续(四次挥手后不关连接,流水(默认)和非流水方式) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513222100995.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### HTTP请求报文 Get,Post,Head,http 1.1新增 Put,Delete Get命令不需要实体部分,POST需要 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202105132227381.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513222754917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### 提交表单输入 有两种方式,Get和Post都可以。 Get:在URL中使用特定的参数,参数:wd,cl,参数值:xx+yy+zzz,3 `http://www.baidu.com/s?wd=xx+yy+zzz&cl=3` ### HTTP响应报文 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513223954925.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) `\r\n`回车换行,为什么要Content-Length呢?因为TCP是字节流的,不区分报文与报文的边界,需要应用进程自己维护边界 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513224011354.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) #### 用户-服务器状态: cookies #### Web缓存(代理服务器) - 客户端访问更快,服务端负载减轻,网络负载减轻 - 可以使用本地代理服务器加速访问,因为用户访问的网站具有趋同性 - 但是可能缓存的和服务器的不一致的,过期了,这就要用到condition get,将本地保存的修改时间与服务器的修改时间比较 ### 2.3 FTP 端口号:21 FTP的用户名和密码都是明文传输的,怪不得要用SFTP呢 控制连接+数据连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210521222903938.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### 2.4 EMail 3个主要组成部分: - 用户代理(客户端软件,outlook) - 邮件服务器(守候在25号端口) - 协议(SMTP ) 收到的邮件放在邮件服务器的文件夹中,由用户代理拉取,拉取的协议有POP3,IMAP(提供更多特性,可创建远程目录),HTTP 原始的协议只能传输ASCII,需要打补丁才能传汉字、可执行文件等,MIME(多媒体邮件扩展) ### 2.5 DNS 域名到IP地址的转换;负载均衡(决定解析为哪个分布式主机来提供服务) 运行在UDP之上,53号端口,在端系统(网络边缘)实现 #### 2.5.1 怎么命名? - 为避免重名问题,使用层次化的命名 DNS域名结构: 几百个顶级域名,包括通用的和国家的。 根名字服务器:13个 #### 2.5.2 怎么解析 名字空间划分为若干区域 上层域需要知道下层的物理地址,区域名字服务器维护资源记录(resource records) - 作用:维护域名-IP的映射关系 - 位置:Name Server的分布式数据库中 RR格式: - domain_name - ttl: time to live,权威(无限大)或缓冲(有限),缓冲为了性能,删除为了一致性 - class类别:对于Internet,值为IN - Value值:数字、域名或ASCII串 - Type类别:资源记录的类型 DNS记录: Type = A - Name为主机 - Value为IP地址 Type = NS - Name为域名 - Value为该域名的权威服务器的域名 Type = CNAME - Name为规范名字的别名 - value为规范名字 设备上网:IP,所在局域网的子网掩码,网关,local name server ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524215114214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524215126444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 添加记录: 1. 注册域名; 2. 一个记录指向新增子域的域名,一个记录指向域名服务器的地址 3. 在指定的域名服务器中要确保有用于Web服务器的类型为A的记录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524220730890.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 在腾讯云买的域名,提供DNS解析,要自己添加A记录,使域名指向IP,然后DNS服务器会将该映射记录下来。 #### 2.5.3 攻击DNS DDos攻击,重定向攻击 ### 2.6 P2P应用 C/S:扩展性问题,可靠性问题 文件的Hash值是唯一标识 非结构化P2P: 1. 集中化目录,最初的Napster a. 当对等方连接时,它告知中心服务器IP地址和内容(我来了,我有什么) b. 某客户端请求某个文件,目录服务器告诉它谁有 c. 客户端从“谁”那请求文件 缺点:单点故障问题,目录服务器侵权容易定位,性能瓶颈 2. 完全分布式,Gnutella a. 泛洪查询; b. 邻居会重复,需要解决 c. 网络是怎么建立来的呢?在安装软件是,有一些列表(它们大概率是在网络中的),ping它们,它们pang回来,随机选取一些节点构建overlay d. 怎么下线?A依次告诉邻居们下线了,邻居们知道后再选一个节点,维持连接强度 3. 混合式,KaZaA,安排个组长 BitTorrent:tit-for-tat 你为我提供的服务多,我为你提供的也多 torrent文件中储存了tracking sever信息,告诉客户端向哪些节点请求 DHT(结构化) 维护树状或环状拓扑,查询快,副本不需要太多 ### 2.7 CDN #### 2.7.1 视频流化服务和CDN:上下文 如何向众多用户提供服务?(Content Distribution Networks) 特点:用户规模大,具有异构性,“二八分布”,重复流量多,“跳”多 解决方案:分布式的,应用层面的基础设施,通过CDN,全网部署缓存节点 CDN运营商:节点部署,内容部署,节点拥塞时的动态选择 多媒体流化服务:DASH enter-deep:部署在local ISP,离用户近,用户体验好 bring-home:部署在少个关键位置 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210525220510953.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 简单的例子: 客户端请求视频http://example.com/abc123,视频存储在CDN,位于http://kingCDN.com/exabc123 访问local DNS,local DNS经过处理后告诉客户端到kingCDN的权威名字服务器解析http://kingCDN.com/exabc123,解析完后,告诉客户端到哪个最近的CDN服务器IP获取内容 ### 2.8 Socket编程 #### 2.8.1 TCP套接字编程 TCP传输字节流 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210526160045710.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210526160100594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) #### 2.8.2 UDP套接字编程 在客户端和服务器之间没有连接,传送的也叫数据报,和IP传送的东西叫法一样 发送端在报文中要指明**目标IP和端口,发送的内容,谁发的** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210526162007296.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 赞赏 微信支付 支付宝支付