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()