我们平时在百度上搜索知识,我们的电脑就是客户,从百度服务器请求东西,构成了C/S体系。客户发请求,服务器接收并响应请求。
我们平时用手机QQ给伙伴传输文件,我的手机既可以作为服务器给对方传输文件,也可以作为客户端接收文件。我的手机既是客户端又是服务器。
存在某个中心服务器,当用户上线时在服务器注册IP地址,并向服务器说我这有哪些资源(我在哪,我有啥)。当另一个用户向从服务器请求某个资源,服务器会进行文件搜索(这一过程是C/S模式)。当服务器检索到某一用户存在该资源,服务器可以提供有资源的用户IP地址,这两名用户就可以进行传输资源(这一过程是P2P模式)。
同一个主机内,进程间通信使用进程间通信机制通信(操作系统)
不同主机,通过交换==报文(message)==来通信
区分应用进程3要素:
- 唯一的32位IP地址。【找到某台主机】
- 用TCP还是UDP进行通信
- 在TCP或UDP上的端口号【找到主机上的某个进程】
应用层需使用传输层提供的服务实现进程通信功能。应用层与传输层间存在SAP(TCP/IP:socket)服务访问点,可通过SAP调用应用层序接口API(TCP/IP:socket API)来实现进程通信。
服务访问点(SAP):是一个层次系统的上下层之间进行通信的接口,N层的SAP就是N+1层可以访问N层服务的地方。【SAP:调用函数的地方;函数:提供服务的方式】
应用层向传输层传递数据必须携带的信息:
如果每次使用Socket API传输报文时都得携带以上信息,不容易管理。便引入socket
这一概念,作为信息的代表。
TCP socket
TCP socket:
用一个整数(本地标识)来表示一个四元组:<【源 IP】, 【源端口】,【目标 IP】 ,【 目标端口】>
在传输层维护一张表,某个整数(标识)可映射到某一对应四元组。一个整数对应一个四元组,一个四元组对应一个会话
。
引入socket后,应用使用这个标识,与远程的应用进程通信,不必在每一个报文的发送都要指定这 4 元组。
就像使用操作系统打开一个文件, OS返回一个文件描述符一样,以后使用这个文件描述符,而不是使用这个文件的目录名、文件名。
UDP socket
UDP socket:
用一个整数(本地标识)来表示一个二元组:
UDP 套接字指定了应用所在的一个端节点( end
point )【端结点=IP+port】
TCP提供可靠的传输,就像淘宝卖家给我们发货,对应的四元组<卖家地址,卖家门牌号,买家地址,买家门牌号>,货物损坏你可以发回去给卖家。
UDP提供不可靠的传输,我给你发东西,东西坏了你不需要给我发回来,只需要<发货地址,门牌号>二元组即可。
Web 页:由一些对象组成。
对象可以是 HTML 文件、 JPEG 图像、 Java 小程序、声音剪辑文件等。
Web 页含有一个基本的 HTML 文件,该基本 HTML 文件又包含若干对象的引用(链接)。
通过URL对每个对象进行引用
【对象嵌套
对象】
HTTP是Web的应用层协议,采用C/S模式。
浏览器向服务器请求对象过程:(HTTP建立在TCP之上)
- 服务器守在TCP 80号端口,存在一个waiting socket 等待建立连接请求。
- 某主机浏览器通过socket API 向服务器发起连接请求。
- 服务器接受响应请求并创建一个socket代表这段会话关系。
- 连接建立后,浏览器采用HTTP协议向服务器发出对象请求。
- 服务器响应HTTP请求,返回响应对象。
【返回的对象是HTML框架,在主机页面展示过程中若碰到指向图片的引用(指向图片的url),需再次与对应主机建立TCP请求,把对象拉过来】
HTTP一般是无状态的;
无状态:服务器不维护客户端状态,既对象响应后就断开连接。
【无状态的服务器能够支持更多的客户端】
非持久HTTP
访问一个网页可能需要多次建立TCP连接,获取HTML框架的TCP连接,在HTTP请求与响应。HTML中的图片影评又得依次建立TCP连接和HTTP请求响应
【在非持久HTTP连接中,请求一个对象最少需要2个RTT(TCP连接请求与响应+HTTP请求与响应)】
持久HTTP
- 获取GET,发送POST,只获取头部(只为了获取部分信息,不用发送对象内容)HEAD。
- Host:访问主机域名
- User-agent:用户代理
- Connection:关闭持久连接
第1行200是响应状态码
第5行Lat-Modified是最后更改日期。有时HEAD请求就为了获取这个修改时间,及时更新本地对象内容。
第6行Content-Length是文件数据长度。HTTP提供内容边界(TCP不提供)
HTTP默认是非持久连接,不维护客户状态信息,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待。【那些广告精准投放啥的就不能实现了,进入下一个功能页还得输入账户密码】
cookies是把用户信息存储在本地某个文件夹下的一个手段,解决用户与服务器之间的无状态通信。
引入cookies后访问某一对象:
28原则:百分之八十的用户访问百分之二十的内容。
那我们把这百分之二十的内容存到一个方便的地方,其他人要用在从这取不就更快速了嘛。
第一台电脑先经过代理服务器后访问终端服务器,代理服务器存储访问内容。第二台电脑访问同一个内容,就只需访问代理服务器,不用在去请求终端服务器。
代理服务器就起到了Web缓存的功能【代理服务器既是服务器也是客户端==》缓存既是客户端又是服务器】
在开发网站时,可通过FTP协议将网站程序上传到Web服务器。工作方式分为:主动方式和被动方式
FTP 服务器维护用户的状态信息:当前路径、用户帐户与控制连接对应(有状态)
- FTP服务器守护在TCP21号端口,等待连接建立请求
- FTP客户端向服务器的21号端口发送连接请求
- 服务器接受请求后,建立起一条命令连接
- 传数据时,客户端在命令链接上向服务器发送PORT命令(客户端接收数据端口)
- 服务器收到命令后,通过自己的20号端口与PORT命令中指定端口发送连接请求,建立数据连接。
- FTP服务器守护在TCP21号端口,等待连接建立请求
- FTP客户端向服务器的21号端口发送连接请求
- 服务器接受请求后,建立起一条命令连接
(以下为不同之处)- 传数据时,客户端在命令链接上向服务器发送PASV命令
- 服务器收到命令后,
随机
开启一个端口并向服务器发送端口信息- 客户端向服务器指定端口发送连接请求,建立数据连接
3个主要组成部分:
发送:SMTP
获取:POP3
用户代理向邮件服务器发送报文,邮件服务器向邮件服务器发送报文==》SMTP
用户代理从邮件服务器获取邮件==》POP3
SMTP使用TCP在客户端和服务器之间传送报文,端口号为 25。
SMTP要求传输的报文必须为7位ASCII码
SMTP采用持久连接,在无报文发送后才关闭连接。
- IP 地址标识主机、路由器;但IP地址是一串数字,不便于人类使用。人类一般倾向于使用一些有意义的字符串来标识Internet 上的设备。
- 存在着“字符串” 到IP 地址的转换的必要性。人类用户提供要访问机器的“字符串”名称,由 DNS 负责转换成为二进制的网络地址
用有意义的字符串:好记,便于人类用使用。
最开始是一个平面命名,只有一个(集中)维护站:维护着一张主机名 -IP 地址的映射文件。
一个平面存在的问题:
网络中主机数量多,名字重复问题会很严重。
方案:Domain Name System(DNS)
DNS主要思路:
DNS是在网络边缘上的。互联网很多核心内容在建立在互联网边缘的端系统的应用之上实现的。
DNS将原来一张存有映射关系的表格,转变为一棵树形结构的映射树。
不同节点的字节点可以有相同的命名,叶节点代表主机如:robot.ai.cs.yale.edu.就表示一台主机。
域名的管理:
域与物理网络无关,同一域可在不同网络,同一网络可在不同域,域的划分是逻辑的,而不是物理的。
只有一个名字服务器,容易出现单点故障、通信容量大和集中式数据库维护上面的问题。
P2P好处:搭建极少的服务器,存在大量的结点相互服务。任意端系统都可以直接通信。
纯P2P架构应用例子:
所有用户都从服务器获取文件
问题:
n台主机从服务器获取大小为F的文件最少需要多长时间?
答:
第i台主机下载F大小文件的时间: F/di。取max{F/di}既用户获取大小F文件的下限时间。
服务器发送n个F大小文件的时间:(nF)/us
∴最少时间= max{F/dmin,(nF)/us}
当n变得很大时,主机获取文件速度大致不变,而服务器发送文件时间线性增加(服务器性能成为瓶颈)。
主机可以从另一台主机获取文件
问题:
n台主机从服务器获取大小为F的文件最少需要多长时间?
答:
服务器至少上传一份文件:F/us
每台主机至少下载一次:F/dmin 【取最大的】
可提供的上载能力:(NF)/(us+∑ui) 【分母是一共要下载NF大小的文件;分子是服务器上载带宽,∑ui是各主机共同提供的上载带宽】
∴最少时间= max{F/us,F/dmin,(N*F)/(us+∑ui)}
随着n的增加,获取文件时间在增加,但并非线性增加,增加较为缓慢。
任两台端系统进行一次会话交流,建立起一条连接,这两台主机就存在一条边的关系(应用层逻辑上的相邻)。
非结构化P2P:边的关系是随机的任意的。【实例:集中化目录、完全分布式、混合体】
应用实例:
文件共享(集中化目录)
目录是集中式的,文件分发是P2P模式
全分布式
没有中心服务器,开放文件共享协议。
Gnutella协议:
泛洪查询:结点向相邻邻居发出查询请求,邻居在向他的邻居发出查询请求。(每一个结点都是对等的)
混合体
结构化P2P:边的关系是有序的。【如构成环、树的关系】