10 传输模型与套接字(进阶)

01-传输模型

第一部分 传输模型

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

原文地址:https://www.cnblogs.com/zcmq/p/9275858.html