33 udp 域名 进程

1.UDP协议

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection 参考模型中一种无连接的传输层协议,提供简单不可靠信息传送服务

是一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成。且不对传送数据包进行可靠性保证,适合于一次传输少量数据。

 

2.UDP 通讯流程

UDP通讯流程与对讲机非常类似

买传呼机 == socket() 固定对讲频道 == bind() 收信号 == recvfrom() 发信号 == sendto() 由于不需要建立 连接所以省去 TCP的listen()和accept()这两步

3.udp 的使用

服务端

'''
import socket
# 默认为tcp
# client=socket.socket()
# 所以要手动指定
# udp 中要用socket.SOCKET_DGRAM
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
'''

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)


server.bind(('127.0.0.1',1854))

# 指定长度 并且返回一个二进制
# data=server.recv(1024) 在这不合适
# recv 返回的数据就是数据
# udp 中只管给客户端发送文件
while True:
data,addr = server.recvfrom(1024)
print(data)
print(addr)
print('收到%s的信息%s'%(addr,data))
# data为 一个元组
server.sendto(data.upper(),addr)




# # 缓冲区大小
# buffer_size=1024



# server.close()

客户端

from socket import *

client = socket(AF_INET, SOCK_DGRAM)
#udp 中不需要建立连接
# 不仅要发送,还要明确对方地址
client.sendto('hello'.encode('utf-8'),('127.0.0.1',1854))

data,addr=client.recvfrom(1024)
print('收到%s的信息%s' % (addr, data))

client.close()

udp 不会粘包  

服务器

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

server.bind(('127.0.0.1',9632))

# 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。

data,addr=server.recvfrom(3)

print(data)

客户端

import  socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

client.sendto('hello'.encode('utf-8'),('127.0.0.1',9632))


client.close()

缓存区大小不可能无限大,如果要传输大数据超过UDP数据报大小,则需要在UDP基础上加上额外的应用层协议。

并且即使缓冲区足够仍会出现数据丢失,UDP的最大数据长度为1472

计算方式:

1.在链路层,由以太网的物理特性决定了数据帧的长度为64+18-1500+18,其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;   2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;  3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   

所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。

udp 的时间服务器练习
服务器
from socket import  *
import time

server = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",1688))

while True:
data,addr = server.recvfrom(1472)
res = time.strftime(data.decode("utf-8"),time.localtime())
server.sendto(res.encode("utf-8"),addr)

客户端
from socket import  *

client = socket(AF_INET,SOCK_DGRAM)
client.sendto("%Y-%m-%d".encode("utf-8"),("127.0.0.1",1688))
data,addr = client.recvfrom(1472)
print(data)


tcp 和udp 
tcp:可靠,传输安全,粘包
通过连接传输:在发送数据时,会等到对方确定接收完成时,将数据删除,如果没有,就会保存到内存,等待确认
udp:不可靠,不须建立连接,不粘包,
发送数据,一旦发送,就会删除缓存数据,如果没收到,那就没收到
与TCP的区别    *****
不可靠传输
不需要建立连接
不会粘包
单次数据包不能太大

代码 :
服务器端
服务器不需要监听 listen
不需要接收请求 accept
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)

客户端:
不需要建立连接
收数据 recvfrom(缓冲区大小)
发数据 sendto(数据,地址)


域名:

IP地址的别名,同时为了在查询名字与地址对应关系时更快,所以给域名也划分了不同区域。


DNS

全称域名解析服务器,其本质上就是一个大型数据库系统

作用:

将域名转换为IP地址 要连接服务器 一定的知道IP  

 单独ip不方便记忆  所以我们把ip和一个域名绑定到一起   域名一串有规律的字符串  www.baidu.com

DNS 是CS结构的server端
DNS 使用的是UDP 协议 因为 传输的数据小 但对速度要求高 一个DNS要服务很多计算机

http:// news.cctv.com /2019/05/29/ARTIXRqlqFBp59eECweiXTUU190529.shtml
协议名称 域名 文件路径

DNS 本质就是一个数据库 里面就存储 域名和ip的对应关系
news.cctv.com
.com 顶级域名
cctv 二级域名
news 三级域名

进程

进程指的是正在运行的程序,是一系列过程的统称,也是操作系统在调度和进行资源分配的基本单位

进程是实现并发的一种方式

操作系统
主要功能
1.控制硬件,隐藏丑陋复杂的硬件细节
2.将无序的硬件竞争变得有序

多进程的实现原理-多道技术

位于应用软件和硬件设备之间,本质上也是一个软件,

由系统内核(管理所有硬件资源)与系统接口(提供给程序员使用的接口)组成

操作系统是为方便用户操作计算机而提供的一个运行在硬件之上的软件

多道技术:为了提高计算机的利用率
1.空间复用 把内存分割为不同区域 ,每个区域装入不同的程序
空间上的复用最大的问题是:程序之间的内存必须分割,
这种分割需要在硬件层面实现,由操作系统控制。
如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,就失去了安全性和稳定性

2.时间复用 当一个程序执行IO操作时,切换到另一个程序来执行
光切换还不行 必须在切换前保存当前的状态 以便与恢复执行

当内存中有多个程序时,必须保证数据是安全的
每个进程之间的内存区域是相互隔离的,而且是物理层面的隔离
有了多道技术
计算机就可以在同一时间处理多个任务(看着像 由于计算远比人块 所以感觉同时执行了)

注意:并不是多道就一定提高了效率
如果多个任务都是纯计算 那么切换反而降低了效率
遇到IO操作才应该切换 这才能提高效率


原文地址:https://www.cnblogs.com/komorebi/p/10952846.html