计算机网络——第二章(应用层)

文章中所有图片均来自中科大郑烇教授在b站发布的——“中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程”

第二章(应用层)

传输层向应用层提供服务的形式原语是socket api

应用层原理:

在这里插入图片描述
可以通过socket接口来创造各种各样的协议
在这里插入图片描述
网络应用是在端系统上的,通过客户端和服务器之间的通信来完成交互

网络架构:

在这里插入图片描述
网络的架构类型主要分为cs架构和p2p架构
在这里插入图片描述
服务器持续监听某一个端口,等待客户端的连接
存在问题:

  • 可扩展性差,虽然自身的服务器虽然可以升级,但是集中式的服务导致了到客户端的数据流量大,网络线路的扩展是比较难的,当用户到了一定程度会出现服务能力断崖式的下降
  • 可靠性差,服务器宕机应用就不能运行了

在这里插入图片描述
每一个结点既作为客户端,又作为服务端,在一个会话中可能是客户端但是在另一个会话中可能就是服务端,提供服务的结点的数量不断增加,服务能力可以维持在一个较为平衡的程度
存在问题:

  • 每个结点只有在上线时才提供服务,这给管理带来了问题

在这里插入图片描述
Napster:一个唱片分发系统,当一个结点上线,给服务器发送上线通知并告知自己可以共享的音乐,当另一个结点想要去请求某种音乐,就可以向服务器发送请求,服务器告知哪个结点又这种资源,客户端只需要使用Napster协议就可以向对应的结点请求资源了。
这种方式属于cs和p2p的混合模式

socket:

在这里插入图片描述
网络实现的就是两个网络进程之间的通信,也就是需要在操作系统的网络协议栈的支持下,遵守网络规范实现通信,为了完成网络通信需要解决下面几个问题
在这里插入图片描述在这里插入图片描述
使用ip来标识主机,使用TCP或UDP端口号来标识具体某个服务,这样通过一个ip地址和一个tcp/udp端口号就可以唯一标识一台主机上的一个网络服务
在这里插入图片描述
应用层使用传输层的服务需要提供什么东西:传输的数据,具体那个一应用传的(端口和ip),具体发送到哪个用户(端口和ip)

在这里插入图片描述
可以将TCP socket看成一个句柄,TCP socket可以看成一个四元组,里面主要的信息包括自身ip,自身端口,对方ip,对方端口,这样不需要每次向下层提供地址标识了,只需要知道一个句柄就可以 (这里我之前有个误区,之前一直以为只有到了网络层才会获得自身ip地址,其实这种想法是错误的,socket携带ip地址,并将其交给网络层封装)
UDP socket看成两元组,主要是自身ip和自身端口
四元组和二元组的主要区别就是,是否与对方建立连接
在这里插入图片描述
socket对应的就是会话的关系,也就是说在一个端口上,可以有多个socket来标识这个进程和不同主机进程之间的通信,只需要使用不同的socket就行了
在这里插入图片描述
upd的socket不需要建立连接,udp的socket只是来标识一个应用,而不是会话,因为udp的socket只标识了自身ip和自身端口,所以对端的ip和端口可以再定义,所以我们可以使用这个socket来与多个ip和端口的组合通信
udp传输层需要的东西:数据,udp socket,对方的端口和ip
在这里插入图片描述
套接字也就是一个在本地具有意义的数字,tcp socket标识的就是一个自生进程和对方进程的会话关系,udp socket标识的就是一个自身的进程,通过再提供对方的ip和端口就可以和它通信了

在这里插入图片描述
协议主要是通过调用传输层的api来构建的
在这里插入图片描述在这里插入图片描述
应用层需要传输层给其提供相应自己需求的功能,比如有些应用对于可靠性传输要求高,有些对于可靠性传输要求不高,可以根据这个来选取不同的传输层协议
在这里插入图片描述
传输层主要是两种协议,tcp和udp协议,这两种协议分别提供可靠和不可靠的传输服务,但是udp相比tcp也并不是没有存在的必要

在这里插入图片描述
udp提供的不可靠传输服务可以使用在视频,音频等对于可靠性要求较低的数据传输服务中,这样没有tcp为了可靠性的重传,能更好的保障服务的流畅度
在这里插入图片描述在这里插入图片描述
SSL:作为应用层存在,应用通过使用SSL的库来完成加密服务

WEB和HTTP:

在这里插入图片描述
所有网络上的对象都可以使用url的形式来标识
如果在url中没有用户名和口令就是匿名访问
当我们访问网络,就是通过主页面不断的访问指向的对象来构成页面的

在这里插入图片描述
文本和文本直接有指向关系

在这里插入图片描述
服务器监听在80号端口,存在一个守候socket,当一个客户端和服务器建立连接就新建连接socket来作为会话标识
当客户端收到html,就会画出页面,同时请求其中包含的url
http为无状态协议:客户端请求服务器,当客户端收到资源,连接就关闭了,这样便于管理,但是这样也导致了当我们登陆后,请求另一个页面,这是否服务器需要判断我们是否登陆了还需要再一次让我们登陆

在这里插入图片描述
在http1.0中,一次tcp连接只有一次http请求,然后服务器发出回应,再断开连接
在http1.1中,一个tcp连接可以,客户端可以决定是否要关闭tcp连接,这样就可以做到多次请求
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样非持续的连接,每次请求都需要使用2RTT时间来建立连接,这对于效率的影响是很大的

在这里插入图片描述
持久化的http可以保证在每次客户端发送请求时,携带一个字段说明,当服务器完成这一次会话是否需要断开连接,connection字段:是否获得对象后服务器关闭连接
同时http1.1中还引进了流水线模式:

  • 非流水线:客户端只有收到上一个请求才发出下一个新请求
  • 流水方式:多个请求同时发出 http1.1版本的默认方式

在这里插入图片描述
head主要是搜索引擎使用,html头部通常有页面的描述信息,可以用来建立索引
get方式后面没有东西了,但是post方式在后面还有载荷信息
不需要ip和端口因为已经封装到了socket连接中
在这里插入图片描述在这里插入图片描述
是否不同的提交方式,参数存放的位置不同
在这里插入图片描述
因为tcp协议的特性,不区分应用层报文之间的边界,所以这里的长度字段用来定位,也就是content-length

cookies:

在这里插入图片描述
http协议是无状态的协议,当请求一个对象,就直接发送给对方,不需要考虑之前是否对方请求过,这样优点就是维护简单,但是如今我们的网络的发展迅速,当我们首先访问一个网页,首先要判断的就是这个用户是否登陆,这样,如果没有一个合适的机制来保证登陆,那我们在访问每一个需要登陆的页面之前就需要就行一次登陆
cookie获得过程:

  • 客户端第一次请求服务器,不携带 cookie
  • 服务器返回一个cookie,并且在数据库中记录
  • 客户端收到cookie,保存到操作系统中,以后的请求都带上cookie来标识自己身份
  • 服务器可以通过cookie来关联客户端的信息
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    cookie带来了很多的隐私问题,长时间的登陆就会包含客户端的很多相关信息
web缓存服务器:

在这里插入图片描述
web缓存服务器对于客户端,服务器和网络带宽都有好处

在这里插入图片描述
proxy对于客户端来说是服务器,对于服务器来说是客户端
在这里插入图片描述
总延时=局域网内延时+接入网络延时(local到isp)+互联网内延时
局域网的带宽为1gbps,15个请求包含的数据量为
在局域网中的时延较低,因为流量强度小,在互联网的时延是确定的为2s,则在接入网络的延时成了关键,因为1s包含的流量为1.5Mb,而网络的链路为1.5Mbps,这就导致了流量强度约等于0.99
计算在接入网络的排队时间 I为流量强度,L/R为一个分组的传输时间
在这里插入图片描述
这样排队时间接进与无限大
导致接入网络的时间达到了分钟级别
在这里插入图片描述
使用安装缓存结点的方式来解决这个问题
在这里插入图片描述
只需要算出在命中和不命中时的加权平均值就可以得到一次访问需要的平均时延了,因为有一部分内容可以在缓存中获得,所以大大降低了排队需要的时间,所以时延大大降低
缓存的风险:
源主机端内容变了,但是本地缓存没有变,http存在conditional get方式,当服务器收到这个,会将修改的内容传输给缓存。
当proxy第一个获得服务器回应,会收到一个时间字段,服务器缓存下来,当有客户需要访问这个页面,但是缓存不确定是否内容修改,可以发出conditional get方式,只需要一个头部,来给服务器确定内容是否修改,当修改了才将内容传回
在这里插入图片描述

FTP:

在这里插入图片描述在这里插入图片描述
FTP的控制和数据传输的连接是分开的
数据传输是通过服务器对客户端建立端口为20的连接
FTP是有状态的连接,因为服务器需要维护客户端当前处于哪个目录下
在这里插入图片描述

EMail:(两推一拉)

在这里插入图片描述
用户代理:客户使用来作为发送邮件的软件
其中浏览器就是http协议的客户端代理,FTP软件就是FTP协议的客户端代理
在这里插入图片描述
邮件服务器:守候在25号端口的服务器
用户代理配置好邮件服务器的ip地址和端口号(smtp),通过邮件服务器轮流发送用户的邮件到指定服务器(smtp),邮件服务器收到邮件将其放入指定用户的邮箱中
用户当登陆邮箱,通过对应的邮件获取协议,从自己的邮箱中获得邮件pop3,http等等
在这里插入图片描述
上图为不同邮件服务器之间的通信,报文的信息需要在7位ascii码范围之内
在这里插入图片描述
http一个报文中,最多只有一个对象(url代表的信息)
在这里插入图片描述在这里插入图片描述
报文中携带MIME协议,使用base64编码,将不在可见字符范围之内的字节,编码成在可见字符范围之内的字符,因为有一些网络设备将不可见字符作为控制信息,这样如果协议中存在不可见字符,就很可能导致设备出故障,所以就行base64编码,可以防止不可见字符的出现。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

DNS:

在这里插入图片描述
给应用层应用提供的解析协议,想要完成这个功能需要回答下面三个问题
在这里插入图片描述
首先使用一台设备来集中解决全球所有的域名,这是不可行的,因为存在单点故障和带宽问题
在这里插入图片描述
在这里插入图片描述
使用udp因为dns是事务性的应用,可以以此来提高速度
dns还提供了服务器别名到规范名字的对应关系,别名就是具体某一台主机的名字,规范名字就是可以共用访问的名字,这样就可以实现负载均衡
在这里插入图片描述
使用层次化命名的方式,将将一个主机的标识划分为若干个域,这样可以大大减少重名
在这里插入图片描述
分布的方式,这样提供了比较可靠的域名解析
在这里插入图片描述
在这里插入图片描述
域名可以分为两类,一类就是域的域名,这标识的是一个范围,还有具体一台主机的域名,这个标识的就是具体的某一台主机
在这里插入图片描述
域名中的主机可以在物理上不在一起,只是逻辑上在一个域中
在这里插入图片描述
每个区域维护本区域的权威名字信息
在这里插入图片描述
权威名字服务器就是某一台主机直接链入的域,比如在ai.cs.yele.edu这个域中,就存在一台权威名字服务器,存储robot这台主机的域名和ip之间的对应关系,当然子啊cs.yele.edu中可能也存在权威名字服务器,来存放cs域中主机和ip的对应关系
在这里插入图片描述
到了ttl就删除资源,当ttl值为一个无限大,这个就是这个域下的主机,也就是说,当ttl值无限大,那么这台dns就是这个主机的权威名字服务器,当ttl值较小,表示这个资源是学习过来的,到了固定事件就会删除
在这里插入图片描述
在这里插入图片描述
本地dns主要起查询功能,当应用需要dns服务就可以向其发起查询
在这里插入图片描述
递归查询的方式主要是,当应用需要dns服务,发送到本地dns,本地dns发送到根dns,根dns通过dns数据库中的ns(对应域的权威名字服务器)表项查找到对应域,发送dns,一路查询到主机。
www.ustc.edu.cn 当一个local name server没有该域名的信息,可以先去cn的name server 然后到edu的name server 递归下去再返回
在这里插入图片描述
根主机只返回对应域的权威dns服务器,然后由本地dns再进行查询
在这里插入图片描述
id号保证了流水线方式的查询
在这里插入图片描述在这里插入图片描述
新增一个域,增加了两条资源记录 NX(域和域名字服务器)和A类型(域名字服务器和ip)
在这里插入图片描述
大多数的local name server都维护了顶级域名到二级域名的对应关系,这样当我们访问local name server可以直接去找到二级域名的name server 而不一定要到顶级域中去查找

P2P应用:

在这里插入图片描述
可靠性,可拓展性高
在这里插入图片描述
在这里插入图片描述
cs的时间下限
在公式中可以体现到,当N不断增加,F/dmin的值可以忽略不记,所以NF/us成为瓶颈
在这里插入图片描述在这里插入图片描述
解释:服务器上载一份F/us 最慢的客户端下载一份 F/us 一共需要的文件数为NF 可使用p2p,每个结点将自身的拥有的资源利用自身带宽上载 NF/(us+Σni) 随着N的增加Σni不断增加,这样就可以保证网络整体的
负担瓶颈不在服务器上
在这里插入图片描述
非结构化p2p:两个p结点存在的邻居关系,构成覆盖网,无序覆盖,任意建立,非结构化存在三种建立模式集中式,完全分布式,混合体;关于结构化的p2p此处没有记录

集中式

在这里插入图片描述
查询资源的工作主要是在一个服务结点完成
存在问题:
在这里插入图片描述
传输过程:
在这里插入图片描述

完全分布式:

完全分布式:没有中心服务器,每一个结点overlay多个结点,查询工作是向邻居发送查询,然后邻居又向其他邻居发送查询,拥有资源目录的结点通过反向的方式返回
存在问题:
但是泛洪查询存在加深网络负载的情况,可以通过ttl方式来防止
overlay网络的建立:
在客户端安装的时候,存在配置文件,存在多个活跃结点,随机挑选一些结点进行ping,当该结点收到ping首先给出回复,根据协议构建overlay,当一个结点退出,可以通过在ping的方式挑选其他结点
在这里插入图片描述
在这里插入图片描述
当一个结点需要资源,就向邻居结点发送查询,当邻居结点没有,也向其邻居结点发送请求

混合体:

混合体:每个结点要不是组员,要不就是组长,组长和组长之间的关系就是gnutella,组员和组长之间关系是napster,当组长查不到需要资源,会像其他组长发送请求
在这里插入图片描述
查询细节:
组长通过组员发来的描述匹配最高匹配度文件,组长将描述返回,组员通过描述的hash值来请求资源
在这里插入图片描述

案例:

在这里插入图片描述
在这里插入图片描述
将资源按照256kB切成若干小块,每个小块对应一个bitmap,这样每个主机就有自己的资源拥有的映射关系,定期的在小组内泛洪bitmap,就可以知道自己需要的资源可以在那里找到。
当一个新结点加入,bitmap为空,当bitmap到达了4,就进行稀缺资源的请求,这样就可以保证网内的拥有稀缺块结点的增加,当稀缺资源得到了,新结点的被请求数增加了,而网络中的另一个策略是对于对自己提供优质服务的结点同样优先提供优质服务,这样新结点因为拥有稀缺资源,可以提供给其他结点服务,这样就可以得到其他结点的优质服务。
当一个结点拥有文件的全部,它就是种子,其他为吸血鬼
在这里插入图片描述当自己拥有稀缺资源:前两个周期通过挑选上一个周期给自己提供了优质服务的结点给他们优先服务,第三个周期通过随机挑选的方式,可能在之后可以得到他们的优质服务。这就是优化疏通方式
在这里插入图片描述
客户端通过带外方式得到种子,在种子中得到tracer server信息,然后和tracer server连接,得到正在进行该资源分享的小组列表,加入到小组中,进行资源分享

CDN:

在这里插入图片描述
视频业务取代图片成为杀手级应用带来了问题:

  • 如何向那么多的用户提供服务
  • 异构的客户端,对于不同的客户端有不同的需求(不同的分辨率,不同的终端设备)

在这里插入图片描述

在这里插入图片描述
视频的编码大小主要取决于空间冗余度和时间冗余度,可就是一张图片的空间上的类似程度 和 两张图片的类似程度
在这里插入图片描述
流化服务就是边下边播:主机通过接收到缓冲区中,然后从缓冲区中拿出数据播放,能极大减少等待时间
在这里插入图片描述
在http上的动态自适应流化服务,通过告示文件提供不同码率,不同段的url地址,客户端通过自身的需求,自身的带宽状况来请求不同块
在这里插入图片描述
可以解决不同客户端,不同网络情况下,给予不同资源的问题
当服务器向同时向多个客户端提供服务,这时候瓶颈成了中间链路和服务器自身,这是靠服务器自身的不断优化想要提高服务质量是不够的,且网络中重复的流量较多,对于链路带宽浪费大。对于这个问题主要有以下两种方案 在这里插入图片描述
在这里插入图片描述
cdn运营商在全球部署cdn服务器(cache),然后互联网内容提供商通过购买cdn运营商的服务,将内容部署到cdn服务器上,以此来提高自身的服务质量,也叫内容加速服务
用户来访问icp,通过域名解析重定向到最近的cdn缓存结点
enter deep:部署在里用户近的地方,也就是local isp
bring home:部署在上层的isp关键结点附近,离不同的关键isp都比较近
在这里插入图片描述
用户请求到告示文件,然后向不同的cdn请求视频,到跳数较少的系欸但请求服务,主要是通过让内容靠近用户
所以在使用cdn的情况下也存在下面几个问题:
在这里插入图片描述
从最近的cdn获得资源无疑是最好的方式
当网络出现阻塞可以往第二近的结点发送请求

DNS的重定向实现CDN选择:

在这里插入图片描述
客户端从服务器页面上获得url,需要解析url的解析
在这里插入图片描述
向local dns要求解析url
在这里插入图片描述
local dns向服务器权威dns要求解析,服务器返回一个CDN的权威dns地址

在这里插入图片描述
向CDN的权威dns要求解析,根据CDN的选择策略决定将哪一个CDN地址返回
在这里插入图片描述
客户端得到CDN地址,连接,获得资源

例子:

在这里插入图片描述

TCP套接字编程:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sin_family:表示使用tcp/ip还是其他协议

sin_zero:使用来对齐,比ip协议长的地址表示方式可以使用这个结构

在这里插入图片描述
h_name:主机域名

h_aliases:主机别名

过程:

服务器:creat welcome:服务器在端口上有一个welcome socket,

服务器:bind:和本地的ip和端口绑定

服务器:con socket=accept(welcome socket):这样,当建立的连接返回一个accept返回一个值,然后con socket再去做其他事情,当没有建立,就阻塞在那里

客户端:创造一个client socket 自动可以进行bind

客户端:socket connect与服务器,进入阻塞,当完成连接建立,解除阻塞

服务器:accept返回一个新的connection socket连接,可以通过这个socket进行通信,同时使用fork函数,给这个socket来提供一个进程进行服务,多个socket可以同时绑定在一个自身ip和端口上

UDP socket:

只和本地的ip和端口捆绑
在这里插入图片描述
发报文:我的socket值,发送给谁,内容

收报文:发送方的ip和端口,内容是什么

服务器创建socket 并绑定

readsocket(udp socket),当收到东西就解除阻塞,不需要建立连接,直接接收处理发送

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值