socket 是应用层与传输层交互的接口, 本质上讲是一个整数, 从操作系统角度来说是表示两个不同主机上应用进程的关系(IP:Port). socket可以分为TCP socket和UDP socket两种, 前者提供可靠的服务, 后者提供不可靠的服务, 但后者相对前者性能高很多. 可靠意味着接收方收到的消息与发送方发送的消息一致(不丢失,不重复,不乱序). 再从编程语言的角度来讲, socket就是一系列的函数与对象, 利用这些函数与对象, 我们可以完成不同主机上应用进程之间的交互.
当我们在编辑器中写下如下代码
from socket import *
with socket(AF_INET, SOCK_STREAM) as dataSocket:
dataSocket.connect((IP, PORT))
# AF_INET代表socket讲采用ipv4进行通信
# SOCK_STREAM代表采用TCP协议(流式), 如果是UDP协议, 就写成SOCK_DGRAM(数据报)打下断点查看dataSocket对象的结构, 会得到如下结果
<socket.socket fd=1276, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 50000), raddr=('127.0.0.1', 20867)>
- 其中fd就是文件描述符
- family则指定了socket所采用的地址类型
- type则说明了socket是采用的协议(TCP/UDP)
- proto也就是protocal也是说明协议类型
- laddr和raddr分别指明了本机和对方主机的IP和端口号
以上就是socket在python语言中的表现形式, 在不同的编程语言中, socket的实现细节可能有所不同, 但大体形式基本一致. 通过socket, 操作系统向网卡最终能读取到的RAM中写入要传输的信息(除了原始报文外, 要加上一系列控制信息譬如目标的IP和端口号), 并通过网卡推送出去.
socket的功能
作为传输层向应用层提供服务的接口,不同主机上的进程可以利用socket实现信息上的交流, socket为一系列应用层协议的实现提供了支持. 利用socket, 我们用类似操作文件的方式进行不同主机不同应用进程之间的数据交互, 向下层传递应用层报文.