10 传输模型与套接字(进阶)
第一部分 传输模型
1、基本模型
2、层次划分
MAC地址:唯一的地址
TCP可靠、UDP不可靠
3、传输层说明
说明一:
作为Python开发,咱们都是在应用层的HTTP协议之上进行开发的。
说明二:
网络编程,主要是了解我们Python能编写的最低的层次,即传输层的基本情况
说明三:
HTTP协议是基于TCP之上的,因此我们需要了解TCP连接的基本过程
第二部分 TCP连接
1、建立连接(三次握手)
为什么三次
因为第一次只是客户端告诉服务端
第二次,客户端才知道服务端收到了
第三次,服务端才知道客户端收到了
2、传输数据
客户端向服务端请求
服务端向客户端响应
一发一收
一收一发
3、断开连接(四次握手)
为什么多了一次?
因为服务端可能还数据要发。
到底是一次连接传一次数据;还是一次连接传多次数据?
都可以:HTTP协议 前者、Websocket 后者
第三部分 IP地址与端口
1、IP地址
127.0.0.1 自己
0.0.0.0 任意访问
2、端口号
端口是用来区分我们的应用程序的,范围:0-65535
02-套接字
第一部分 创建套接字
1、套接字的基本概念
2、创建套接字实例
>>> import socket >>> sock = socket.socket() >>> sock <socket.socket fd=792, # 文件描述符(唯一标识了一个socket) family=AddressFamily.AF_INET, # AF_INET表示IPv4 type=SocketKind.SOCK_STREAM, # SOCK_STREAM表示TCP proto=0> # 通常都是0
3、三种套接字
第二部分 建立套接字连接
1、服务端监听套接字的绑定与监听
>>> import socket >>> server = socket.socket() # 生成套接字 >>> server.bind(('0.0.0.0',8899)) # 绑定套接字,4个0为全网地址,可以不写 >>> server.listen(5) # 监听套接字,5为监听数量
2、客户端套接字的主动连接
>>> import socket >>> client = socket.socket() >>> client.connect(('127.0.0.1',8899))
3、服务端对等连接套接字的生成
>>> import socket >>> server = socket.socket() >>> server.bind(('',8899)) >>> server.listen(5) >>> conn,addr = server.accept() # accept会阻塞
4、accept阻塞说明
第三部分 使用套接字传输
客户端 一发 一收
服务端 一收 一发
recv 会阻塞哟!
# 服务端 >>> import socket >>> server = socket.socket() >>> server.bind(('',8899)) >>> server.listen(5) >>> conn,addr = server.accept() >>> conn.recv(1024) b'hello' >>> conn.send(b'thanks') 6 # 客户端 >>> import socket >>> client = socket.socket() >>> client.connect(('127.0.0.1',8899)) >>> client.send(b'hello') 5 >>> client.recv(1024) b'thanks'
第四部分 断开套接字连接
1、客户端主动断开连接
>>> import socket >>> client = socket.socket() >>> client.connect(('127.0.0.1',8899)) >>> client.send(b'hello') 5 >>> client.recv(1024) b'thanks' >>> client.close() # 断开连接
2、服务端判断客户端断开连接
>>> import socket >>> server = socket.socket() >>> server.bind(('',8899)) >>> server.listen(5) >>> conn,addr = server.accept() >>> conn.recv(1024) b'hello' >>> conn.send(b'thanks') 6 >>> conn.recv(1024) b'' # 接收到空字节,表示客户端已经断开连接 >>> conn.close() # 断开连接
总结:九个操作
操作一: 服务器套接字:bind
操作二: 服务器套接字:listen
操作三: 客户端套接字:connect
操作四: 客户端套接字:send
操作五: 对等连接套接字:recv
操作六: 对等连接套接字:send
操作七: 客户端套接字:recv
操作八: 客户端套接字:close
操作九: 对等连接套接字:close