tm
【计算机网络:自顶向下方法】(二)应用层
学习推荐 : 中科大计算机网络自顶向下
HTML
文件
ISP
)
改进
缓存例子:安装本地缓存
Value : IP
T : type
区域名字服务器维护资源记录
资源记录(resource records)
RR格式: (domain_name, ttl, type,class,Value)
Domain_name
: 域名Ttl: time to live
: 生存时间(权威,缓冲记录)Class
类别 :对于Internet,值为INValue
值:可以是数字,域名或ASCII串Type
类别:资源记录的类型—见下页
一旦名字服务器学到了一个映射,就将该映射 缓存起来
根服务器通常都在本地服务器中缓存着 使得根服务器不用经常被访问
目的:提高效率 可能存在的问题:如果情况变化,缓存结果和 权威资源记录不一致
解决方案:TTL(默认2天)
流量大、用户多 、异构性 不同用户拥有不同的能力(例如:有线接入和移 动用户;带宽丰富和受限用户 . — > 解决方案: 分布式的,应用层面的基础设施
由于存储下载视频 是一对一的关系,则下载未免有些慢了,于是就有了存储视频的流化服务.
多媒体流化服务:DASH
过程
// IP地址和port捆绑关系的数据结构(标示进程的端节点)
struct sockaddr_in {
short sin_family; //地址族
u_short sin_port;// port端口
struct in_addr ,sin_addr; //IP 地址
char sin_zero[8]; // align 对齐
};
//数据结构 hostent 域名和IP地址的数据结构
struct hostent {
char *h_name;//主机域名
char **h_aliases; //数组存储 主机别名
int h_addrtype;
int h_length; /*地址长度*/
char **h_addr_list; // 数组存储 IP地址
#define h_addr h_addr_list[0];
};
UDP提供的是一种不可靠的数据流传输,传输过程中可能会丢包,接收的时候顺序也可能被打乱。
UDP:客户机与服务器之间没有连接
用户端
发送字符串给服务端
, 然后服务端
把字符串修改为大写在发送给客户端
jupyter notebook
中进行编程,安装好jupyter notebook
后,在命令行执行 (我用的vscode)UDPServer.ipynb
from socket import * #引入socket库
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) #从服务器套接字中读取信息(发送的消息和客户机IP地址+端口号)
modifiedMessage = message.decode().upper() #对消息进行处理(此处是改大写)
serverSocket.sendto(modifiedMessage.encode(), clientAddress) #将处理后的消息发回给客户机
UDPClient.ipynb
from socket import * #引入socket库
serverName = gethostname() #由于没得服务器,服务器主机用本机来当
serverPort = 12000 #服务器端口号
clientSocket = socket(AF_INET, SOCK_DGRAM) #创建客户机套接字
message = input('Input lowercase sentence:') #得到输入字符串
clientSocket.sendto(message.encode(),(serverName, serverPort)) #发送数据到相应主机名+端口号的服务器进程
modifiedMessage, serverAddress = clientSocket.recvfrom(2048) #接收服务器发回的消息
print(modifiedMessage.decode()) #显示接收的字符串
clientSocket.close() #关闭客户机socket
服务器端
TCP提供的是一种可靠的字节流(byte-stream)传输(pipe)。
TCPServer.ipynb
from socket import * #引入socket库
serverPort = 12000 #服务器端口号
serverSocket = socket(AF_INET, SOCK_STREAM) #创建服务器套接字(前台)
serverSocket.bind(('', serverPort)) #给套接字绑定端口号
serverSocket.listen(1)
print('The server is ready to receive.')
while True: #服务器要一直在线等待,所以给一个死循环
connectionSocket, addr = serverSocket.accept() #前台套接字接收到请求后,创建一个新的套接字(窗口)
sentence = connectionSocket.recv(1024).decode() #窗口套接字读取信息
capitalizedSentence = sentence.upper() #对消息进行处理(此处是改大写)
connectionSocket.send(capitalizedSentence.encode()) #将处理后的信息发回给客户机
connectionSocket.close() #关闭窗口套接字,前台套接字保持开放
TCPClient.ipynb
from socket import * #引入socket库
serverName = gethostname() #由于没得服务器,服务器主机用本机来当
serverPort = 12000 #服务器端口号
clientSocket = socket(AF_INET, SOCK_STREAM) #创建客户机套接字(类型为字节流SOCK_STREAM)
clientSocket.connect((serverName, serverPort)) #TCP连接
sentence = input('Input lowercase sentence:') #得到输入字符串
clientSocket.send(sentence.encode()) #发送数据到服务器
modifiedSentence = clientSocket.recv(1024) #接收服务器发回的消息
print('From server:', modifiedSentence.decode()) #显示接收的字符串
clientSocket.close() #关闭客户机socket
有BUG 待解决 !!
待补充C++版本