客户端-服务器体系结构
P2P体系结构
当进程运行在相同的端系统上时,它们使用进程间通讯机制互相通讯。进程间通讯的规则由端系统上的操作系统确定。
当进程运行在不同的端系统上时,它们使用计算机网络交互报文而互相通信。
进程通过套接字软件接口向网络发送报文和从网络接收报文。
IP+端口号
端口号作用:用于标识一个唯一的进程。
https://www.iana.org/ 可以用于查看一些比较出名的特定端口号。
运输层提供不止一种协议,当应用层要使用运输层时,必须指明使用哪个协议。
应用程序服务要求:
可靠数据传输(对应:容忍丢失),
吞吐量(带宽敏感应用,如多媒体应用。web应用,邮件应用属于弹性应用)
定时:如保证从发送到接受的时延不超过100ms,对于视频电话和游戏很重要。
安全性:如加密,数据完整性,端点鉴别等
因特网为应用程序提供两个运输层协议:TCP和UDP
面向连接的服务: 通信前的三次握手。这个连接时全双工的(即连接双方的进程可以在此连接上同时进行报文收发)。应用程序结束报文发送时的,必须拆除该连接。
可靠数据传送服务:无差错,按适当顺序交付所有发送的数据,而没有字节的丢失和冗余。
拥塞控制机制:不一定能为通讯进程带来直接好处,但能为因特网带来整体好处。
安全性:无论TCP还是UDP都没有提供任何加密机制。
SSL(Secure Sockets Layer):安全套接字层。注意:SSL不是运输层协议,它只是对TCP的一种增强,这种强化是在应用层上实现的。
如果一个应用要使用SSL,那么该应用的客户端和服务端都需要包括SSL的代码。
发送进程(明文) --------->SSL 套接字-----加密------>TCP套接字------------因特网----------------->TCP套接字--------->SSL 套接字-----解密----->接收进程(明文)
TCP可以提供可靠数据传输服务,TCP+SSL可以提供安全性服务。吞吐量和定时服务是运输层没有提供的保证。
因特网电话:一般是使用UDP进行通信,但使用UDP一般会被防火墙阻挡,所以当UDP通信失败时,TCP作为备用。
定义了运行在不同端系统上的应用程序如何互相传递报文。
有些应用层协议是由RFC定义的,因此它被用在公共域中。如HTTP--->RFC 2616和RFC 1945
还有一些应用层协议是专用的,有意不被公共域使用。如:Skype
讲解顺序:HTTP---->FTP---->SMTP---->DNS---->P2P
web最具吸引力的地方:按需操作。
HTTP有两个程序实现,一个是客户端程序一个是服务器程序。
多数的web页面包含一个HTML基本文件,已经几个引用对象。
URL:由两部分组成,存放对象的服务器主机名和对象的路径名。
HTTP使用TCL作为它的支撑运输层协议。HTTP客户端首先发起一个与服务器的TCP连接,一旦连接建立该客户端和服务器进程就可以通过套接字接口访问TCP。
HTTP是一个无状态协议。
非持续连接:每个请求/响应对经一个单独的TCP连接发送。
持续连接:所有的请求/响应经相同的TCP连接发送。
请求报文:
响应报文:
cookie技术有4个组件:
a.响应报文中的Set-cookie首部行
b.请求报文中的Cookie首部行
c.浏览器中的cookie文件
d.web站点的后端数据库
可以使用cookie来实现购物车
它能代表初始web服务器满足HTTP请求的网络实体。
web缓存器有自己的磁盘存储空间,它能存储最近请求过的对象副本。
web缓存器既是客户端又是服务器。
web缓存器通常由ISP购买并安装。
使用web缓存器的两个原因:
a.直接从web缓存器中拿到对象,可以提高响应速度
b.可以大大减少一个机构的接入链路到因特网的通信量(可以减少流量强度),从而可以不必要求增加带宽,降低了费用。
CDN(Content Distribution Network)内容分发网络:使大量流量实现本地化。
CND的缺点:缓存的信息可能已经过时。
解决方案:使用条件GET方法(HTTP协议有一种机制,允许缓存器证实它的对象是最新的)。
步骤(代理服务器):1.使用get方法。2.发送请求报文中的首部行包含:If-Modified-Since(该值等于初始服务器响应报文中的Last-Modified的值)。3.初始服务器返回的响应报文的状态行: 304 Not Modified说明没有被修改过。
1.电子邮件是一种异步通信媒介
2.邮件系统的三个组成部分:用户代理,邮件服务器,SMTP(简单邮件传输协议:Simple Mail Transfer Protocol)。其中邮件服务器是核心,邮箱也是在邮件服务器上。
3.邮件服务器具有重试机制
4.SMTP:使用的是TCP连接,而且SMTP不使用中间邮件服务器进行转发,而是直接的发送到对方的邮件服务器。
5.SMTP和HTTP的差别:
SMTP是推协议,HTTP是拉协议
6.邮件访问协议:POP3 , IMAP,HTTP(这三种协议都是拉协议)
1.主机的标识方法:主机名 , IP地址
2.DNS的作用:将主机名和IP地址进行映射
3.何为DNS服务器:运行BIND软件的UNIX/Linux服务器。DNS协议运行在UDP之上,一般使用53端口号。
4.DNS还可以提供的其他服务:
主机别名,邮件服务器别名,负载分配
5.DNS的工作机制
DNS采用了分布式的设计方案。没有一台DNS服务区上拥有所有的主机映射。DNS的层次结构分为三种服务器:根DNS服务器,顶级域DNS服务器,权威DNS服务器。还有本地DNS服务器,虽然本地DNS服务器不属于DNS的层次结构,但它的作用和重要。如访问www.amazon.com工作流程大体如下:
客户端--->本地DNS服务器--->根DNS服务器之一--->返回顶级域(com)DNS的ip
本地DNS服务器--->顶级域DNS服务器之一--->返回权威(amazon.com)DNS服务器的ip
本地DNS服务器--->权威DNS服务器之一--->返回最终的主机ip
本地DNS服务器--->把最终的ip地址放回给客户端
客户端--->最终的主机ip
6.DNS缓存
7.DNS的报文记录:
格式:(Name,Value,Type,TTL)
TTL:该记录的生存时间
Name和Value取决与Type,Type有四种类型分别为A,NS,CNAME,MX。
使用P2P体系结构,对总是打开的服务器有最小(或没有)依赖。成对间歇连接的主机(称为对等方)彼此直接通信。这些对等方不为服务提供商所有,而是受用户控制的计算机。
1.对视频流最重要的性能度量是:平均端到端吞吐量。
2.DASH
DASH:(Dynamic Adaptive Streaming over HTTP)经HTTP的动态适应性流。该技术的出现是为了解决HTTP的缺陷:所有客户端接收到相同编码的视频。在DASH中,视频编码为几个不同的版本(有个告示文件),客户端可以依据自己当前的网络状况来动态的请求不同版本的视频。当网络好的时候请求比特率高的视频,网络不好的时候请求比特率低的视频。
内容分发网(Content Distribution Network,CDN)
解决的问题:
1.避免客户端要经过过多的链路才能访问的服务器上的内容
2.避免相同的内容重复经过相同的链路
3.避免单点故障
在写客户端-服务器代码时,开发者首先需要决定是使用TCP还是UDP。
客户端
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM) # 第一个参数:指示了地址簇,AF_INET:表示使用IPv4,第二个参数:指示套接字类型为UDP;客户端端口操作系统自己会附上
message = input('Input lowercase sentence:')
clientSocket.sendto(message.encode("utf-8"), (serverName, serverPort)) # 发送分组
modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # 等待接收服务器的数据,缓存长度为2048
print(modifiedMessage.decode("utf-8"))
clientSocket.close()
服务端
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print('The server is ready to receive')
while True:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
客户端
from socket import *
serverName = 'localhost'
serverPort = 13000
clientSocket = socket(AF_INET, SOCK_STREAM) # SOCK_STREAM 指明是TCP套接字,端口号操作系统自动指定
clientSocket.connect((serverName, serverPort)) # 三次握手,建立TCP连接
sentence = input('Input lowercase sentence:')
clientSocket.send(sentence.encode('utf-8')) # 不需要再附上目的地址(UDP这里是需要附上目的地址的)
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode('utf-8'))
clientSocket.close() # 关闭TCP连接。它引起客户端的TCP向服务端的TCP发送一条TCP报文
服务端
from socket import *
serverPort = 13000
serverSocket = socket(AF_INET, SOCK_STREAM) # 欢迎套接字
serverSocket.bind(('', serverPort))
serverSocket.listen(100) # 等待敲门,参数定义了请求连接的最大数(至少为1)
print('The TCP server is ready to receive')
while True:
# 使用TCP连接,从一侧发送的所有字节不仅确保到的另一侧,而且保证按序到达
connectionSocket, address = serverSocket.accept() # 连接套接字,由特定的客户端专用。
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()