计算机网络 --应用层

来源:互联网 发布:口腔医学专升本知乎 编辑:程序博客网 时间:2024/06/05 00:18

起因

  • 其实也没啥起因,只不过是觉得自己没学好计算机网络,八周的课时,老师自己都不知道自己讲的是啥;我么买了本计算机网络 自顶向下方法,觉得计算机网络还真的是蛮有意思的;而且很多东西,我都自己实验了蛮有趣的;远不是想象的那么枯燥;

应用层

  • 两大体系结构:
    • cs
    • p2p
    • 那什么B/S其实只是一种C/S结构罢了;
  • TCP服务
    • 面向连接的服务,全双工通信,结束时必须拆除
    • 可靠的数据传输服务
  • UDP服务
    • 只提供最小服务,就是把数据发出去,到不到不管;
    • when in doubt, use TCP.
    • 虽然UDP看起来没什么用处,但是在对时效性有关的程序还是可以使用的,但是如今的宽带足够,UDP的作用就不那么明显了;但是UDP也给了自由,可以在UDP基础上,进行改写
  • 运输层提供服务
    • 运输层应该提供四种服务:可靠的数据传输,吞吐量,定时和安全性;
    • 时延和吞吐量至今无法保证,但是互联网还是好好的
    • 安全性,TCP和UDP都不提供,但是TCP的加强版SSL可以做到,但是是基于应用层的;

WEB和HTTP

  • 非持续连接和持续连接
    • HTTP是基于TCP的,也就是面向连接的,最初的协议是每个请求/响应 经一个TCP连接传输,然后就关闭;在当今这种一个web页面,成百上千个资源下肯定不行,所以就修改为持续连接;这样打击都通过一个TCP连接,就不会有等待TCP建立连接的尴尬了;
    • TCP是全双工的,也就是请求和响应是可以同时进行的,我的猜测
  • cookie
    • HTTP是无状态的,所以想知道谁是谁,就需要在本地记录cookie;就好像银行接待人员永远都不关心你是谁,拿着银行发的卡,银行就知道你是谁了;

WEB缓存

  • 其实这个名字听起来比较陌生,代理就简单多了;
  • 正向代理,就是针对客户端而言的,我现在使用的shadowsocks,就可以认为是,我的服务器对我的pc进行了代理,我想要访问境外网站,就可以让我的服务器去建立连接,然后将请求返回到我自己的pc上,只不过应该就没使用缓存功能吧,这个不清楚了;
  • CDN,说起缓存,其实CDN是很典型的例子,在我就近的网络中,有一个结点缓存了很多我需要的资源,比如很多css文件,由于web的页面打开速度很大取决于页面渲染部分,所以CDN的存在就异常重要;
  • 反向代理,针对服务器的,比如我们访问Google,Google肯定有一大堆的服务器,然而面对我们的可能就那么一两个,你要是请求什么,代理就去找什么;这样的好处也就在于,可以隐藏原服务器;
  • WEB缓存中的东西很可能过期,这是就可以问一下原服务器,通过GET方法

FTP

  • FTP其实还蛮简单的,重点就是他有两个端口,20,21;而且很显然,这是面向连接的,就是使用TCP的
    • 21用作控制连接,用户标识,口令,一些操作都是通过控制连接传输的;
    • 20用于传输,就是进行数据传输喽;

SMTP

  • 简单邮件传输协议,一个推协议,从发送端一直推到接收端
  • 用户代理或者干脆就命令行要与自己的邮件服务器进行通信,验证后,发出邮件,邮件先加入邮件服务器的发送队列,然后发到目的用户的邮件服务器;但是假设目的用户不在线,那么邮件服务器就没办法喽;

POP3

  • 邮件访问协议,与邮件服务器端口110建立连接后,验证,然后就可以收取邮件,可以不删除邮件服务器的备份,也可以删除掉;

IMAP

  • 一个复杂的邮件访问协议,可以关联文件夹啥的;

邮件吐槽

  • 今天我们使用最多的其实时浏览器上的邮箱,什么163,qq啊,所以上面三种协议离得真的好远,不过所幸我在腾讯云服务器搭了邮件服务器,稍微加深了一些印象;
  • 邮件绝对不是你发了,对面立马就收到了,在foxmail客户端上,就有收信的操作,然后你就感觉到POP3在干活了;

DNS

  • 提供域名转换服务,主机别名,邮件别名
  • 提供负载分配,但是没法检测云主机的状态
  • DNS请求流程,
    • 将请求发给本地dns,之后本地dns就代替了我们,这时可认为是递归查询
    • 本地dns请求根dns服务器,根dns响应
    • 本地dns再请求dns服务器响应的服务器
    • 如此迭代查询
  • DNS 缓存
    • 很明显的,每次都请求那么多DNS服务器不明智,所以DNS本地会进行缓存

P2P

  • 区别与C/S的结构
    • C/S结构,有明确的服务器,所有资源都需要服务器来承担,当用户量大的时候,服务器宽带就称为限制;
    • P2P结构允许客户端之间互相传输,分发时间的增长就非常缓慢
    • 但是P2P也是有服务器的,只不过服务器会保存洪流表,就是告诉我们应该和谁进行连接;

UDP和TCP 的套接字编程

  • UDP
from socket import *# 主机ip,还有端口serverName = '127.0.0.1'serverPort = 12000#建立一个socket,SOCK_DGRAM表明是UDPclientSocket = socket(AF_INET,SOCK_DGRAM)while True:    message = input('input lowercase sentence: ')    #发送时,要携带主机地址和端口,每次都是    clientSocket.sendto(message.encode(),(serverName,serverPort))    modifiedMessage , serverAddress = clientSocket.recvfrom(2048)    print(modifiedMessage)clientSocket.close()
from socket import *#声明端口,创建SOCKETserverPort = 12000serverSocket = 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()    print(clientAddress)    serverSocket.sendto(modifiedMessage,clientAddress)
  • TCP
from socket import  *# ip,端口serverName= '127.0.0.1'serverPort = 12000#SOCK_STREAM表明这是一个TCP连接clientSocket = socket(AF_INET,SOCK_STREAM)#进行连接clientSocket.connect((serverName,serverPort))sentence = input('input lowercase sentence')#发送,注意已经有了连接,所以不需要指明去哪里clientSocket.send(sentence.encode())modifiedSentence = clientSocket.recv(2048)print('from server',modifiedSentence)clientSocket.close()
from socket import *serverPort = 12000serverSocket = socket(AF_INET,SOCK_STREAM)serverSocket.bind(('',serverPort))# 监听TCP请求,1表示最大连接数serverSocket.listen(1)print("The Server is ready to receive")while 1:    # 创建一个新的socket用来进行传输    connectionSocket ,addr = serverSocket.accept()    sentence = connectionSocket.recv(1024)    capitalizedSentence = sentence.upper()    connectionSocket.send(capitalizedSentence)