计算机网络 --应用层

起因

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

应用层

  • 两大体系结构:
    • 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表明是UDP
clientSocket = 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 *
#声明端口,创建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)
    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 = 12000
serverSocket = 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值