起因
- 其实也没啥起因,只不过是觉得自己没学好计算机网络,八周的课时,老师自己都不知道自己讲的是啥;我么买了本计算机网络 自顶向下方法,觉得计算机网络还真的是蛮有意思的;而且很多东西,我都自己实验了蛮有趣的;远不是想象的那么枯燥;
应用层
- 两大体系结构:
- 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 的套接字编程
from socket import *
serverName = '127.0.0.1'
serverPort = 12000
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 *
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)
from socket import *
serverName= '127.0.0.1'
serverPort = 12000
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))
serverSocket.listen(1)
print("The Server is ready to receive")
while 1:
connectionSocket ,addr = serverSocket.accept()
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)