python day28 TCP协议与UDP协议
程序员文章站
2022-04-14 18:25:27
2019.5.7 S21 day28笔记总结 1. TCP协议 / UDP协议 1.1 TCP协议 1.可靠、慢、全双工通信 2.建立连接的时候 : 三次握手 3.断开连接的时候 : 四次挥手 4.在建立起连接之后 发送的每一条信息都有回执 为了保证数据的完整性,还有重传机制 5.长连接 :会一直占 ......
2019.5.7 s21 day28笔记总结
1. tcp协议 / udp协议
1.1 tcp协议
1.可靠、慢、全双工通信
2.建立连接的时候 : 三次握手
3.断开连接的时候 : 四次挥手
-
4.在建立起连接之后
发送的每一条信息都有回执
为了保证数据的完整性,还有重传机制
5.长连接 :会一直占用双方的端口
-
6.io(input,output)操作,输入和输出是相对内存来说的
write / send -----> 输出 output
read / recv ------> 输入 input
7.能够传递的数据长度几乎没有限制
1.2 udp协议
- 1.无连接的 速度快
- 2.可能会丢消息
- 3.能够传递的数据的长度是有限的,是根据数据传递设备的设置有关系
1.3 应用场景
- tcp 文件的上传下载(发送邮件、网盘、缓存电影)
- udp 即时通信类的(qq、微信、飞秋)
2. osi七层模型 /osi五层协议
osi七层模型 | osi五层协议 | 协议 | 物理设备 | |
---|---|---|---|---|
应用层 表示层 会话层 (三层总结成一层) |
五层 | 应用层 | http / https / ftp / smtp 协议 python代码:hello |
|
传输层 | 四层 | 传输层 | tcp协议 / udp协议 端口 | 四层路由器、四层交换机 |
网络层 | 三层 | 网络层 | ipv4 / ipv6 协议 | (三层)路由器、三层交换机 |
数据链路层 | 二层 | 数据链路层 | mac地址 arp协议 | 网卡、(二层)交换机 |
物理层 | 一层 | 物理层 |
3. socket(套接字)
socket 是一个工作在应用层和传输层之间的抽象层。
- 帮助我们完成了所有信息的组织和拼接
- sokcet对于程序员来说 已经是网络操作的底层了
socket历史:
- (初期)基于文件通信 -------- 完成同一台机器上的两个服务之间的通信的
- (现在)基于网路通信 -------- 完成了多台机器之间的多个服务通信
3.1 socket用于tcp协议
# server.py 服务端 import socket sk = socket.socket() # socket()参数中:family(基于……通信)=af_inet(网络通信), type(协议)=sock_stream(tcp协议),tcp协议默认不用写,如果想要写协议必须是:type=socket.sock_stream sk.bind(('192.168.12.25',9000)) sk.listen() while true: conn,addr = sk.accept() while true: msg = conn.recv(1024) if msg.decode('utf-8').upper() == 'q': break print(msg.decode('utf-8')) cont = input('内容(输入q断开):') conn.send(cont.encode('utf-8')) if cont.upper() == 'q': break conn.close() sk.close() # client.py 客户端 import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) while true: msg = sk.recv(1024) if msg.decode('utf-8').upper() == 'q': break print(msg.decode('utf-8')) cont = input('内容(输入q断开):') sk.send(cont.encode('utf-8')) if cont.upper() == 'q': break sk.close()
sk.accept() 与 sk.connect() 是建立三次握手的过程
3.2 socket用于udp协议
# server.py 服务端 import socket sk = socket.socket(type = socket.sock_dgram) # udp协议必须加上 type=socket.sock_dgram sk.bind(('127.0.0.1',9000)) while true: msg,client_addr = sk.recvfrom(1024) # recvfrom用于不知道对方ip时,获取到ip给client_addr msg = msg.decode('utf-8') print(msg) msg1 = input('>>>').encode('utf-8') sk.sendto(msg1,client_addr) sk.close() # client.py 客户端 import socket sk = socket.socket(type = socket.sock_dgram) while true: inp = input('>>>').encode('utf-8') sk.sendto(inp,('127.0.0.1',9000)) msg = sk.recv(1024).decode('utf-8') # 这里不需要使用recvfrom,因为知道对方ip地址 print(msg) sk.close()