网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket套接字就像我们说话用某种语言一样,在网络上的各台计算机之间也有一种语言,这就是网络协议,不同的计算机之间必须使用相同的网络协议才能进行通信。
-
网络协议:一套规则
-
网络模型:
-
七层模型 -七层
-
物理层
能看见的东西 -
数据链路层
接线传信号 -
网络层
负责网络 -
传输层
该层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用 -
会话层
负责发送东西前向目标服务器发送数据包 -
表示层
负责把东西表达出来 -
应用层
应用层需要完成数据的管理和数据的处理
-
-
四层模型 - 实际应用
- 链路层
向该层用户提供透明的和可靠的数据传送基本服务 - 网络层
负责网络 - 传输层
该层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用 - 应用层
应用层需要完成数据的管理和数据的处理
- 链路层
-
每一层都有相应的协议负责交换信息或者协同工作
-
TCP/IP 协议族
-
ip 地址:负责网络上唯一定位一个机器
-
ip 地址分5类
-
是由四个数字段组成,每个数字段的取值是0-255
-
Ipv4 Ipv6
-
-
端口
-
范围 0-65535
-
知名端口:0-1023
-
非知名端口 :1024-65535
-
-
TCP/UDP协议
-
UDP 非安全的不面向连接的传输(非安全的不面向连接的传输,没有顺序,大小限制64kb(优点速度快))
-
TCP 基于连接的通信(慢(优点:安全))
-
-
socket 编程
-
socket (套接字):是一个网络通信的端点,能实现不同主机的进程通信
-
通过IP + 端口定位对方并发送信息
-UDP (及时通信用到)
-TCP(慢-安全)
-
1. UDP通信
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
- 使用UDP套接字发送数据
# 导入socket 模块
import socket
# 协议组(AF_INET IPV4) UDP通信SOCK_DGRAM
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 发送的数据必须以2进制 接收的地址以元祖方式 IP用字符串 端口用数字
udp_socket = sendto("发送的数据".encode("utf-8"),("127.0.0.1":8063))
# 关闭套接字
udp_socket.close()
- 使用UDP套接字接收数据
import socket
# 创建UDP通信
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
# 绑定IP和端口
udp_socket.bind(("127.0.0.1",7788))
# 接收发送的数据 类型为元祖("内容",("ip",端口))
recv_data = udp_socket.recvfrom(1024)
print("发送的数据是 : %s" % recv_data[0].decode("utf-8"))
print("发送的地址是 : %s" % str(recv_data[1]))
# 关闭套接字
udp_socket.close()
2. TCP通信
TCP 传输控制协议 是一种面向链接的,可靠,基于传输层通信协议,由IETF的RFC 793 定义
- 使用TCP套接字发送数据
import socket
# 创建TCP链接
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 链接服务器
tcp_client_socket.connect(("127.0.0.1",6689))
# 发送的数据
tcp_client_socket.send("数据".encode("utf-8"))
# 关闭套接字
tcp_client_socket.close()
- 使用TCP套接字接收数据
import socket
# 创建TCP链接
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP和端口
tcp_server_socket.bind(("",7890))
# 监听
tcp_server_socket.listen(128)
# 获取数据 一个新的套接字 , 一个为IP和端口
tcp_center_socket,addr = tcp_server_socket.accept()
# 回送数据
tcp_center_socket.send("接收到数据".encode("utf-8"))
tcp_server_socket.close()