Socket 是什么
经常会提到 Socket ,但是绝大多数人对于这个还是一个很蒙圈的状态,所以从网上找了一堆的资料,简单的将 Socket 做一个详细一些的解释。
Socket 直译是插座
的意思,一般翻译成套接字
,简单的来说就是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 socket。
在百科中的解释是 Socket本质是编程接口(API),对TCP/IP的封装
,所以要想搞明白 Socket
就要先弄明白什么是 TCP/IP
,但是要想搞明白 TCP/IP
又要先弄明 网络七层协议
,这个路绕的有点大,下面就一个一个搞清楚。
网络七层协议
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为 OSI 模型(OSI model),就是通常所说的网络七层协议。
第 1 层 物理层(Physical Layer)
在局部局域网上传送帧,它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等。在这一层,数据的单位称为比特(bit)。属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45 等。如 RJ-45,就是日常电脑连接的网线的水晶头的规格。
第 2 层 数据链接层(Data Link Layer)
负责网络寻址、错误侦测和改错。将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路,并对物理层的原始数据进行数据封装。数据链路层中的数据封装是指:封装的数据信息中,包含了地址段和数据段等。地址段含有点对点发送节点和接收节点的地址(如 MAC),控制段用来表示数格连接帧的类型,数据段包含实际要传输的数据。例如以太网、无线局域网(Wi-Fi)等。
第 3 层 网络层(Network Layer)
决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络数据。例如:互联网协议(IP)等。
第 4 层 传输层(Transport Layer)
把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议义(TCP、UDP)等。
第 5 层 会话层(Session Layer)
负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。
第 6 层 表达层(Presentation Layer)
把数据转换为能与接收者的系统格式兼容并适合传输的格式。
第 7 层 应用层(Application Layer)
提供为应用软件而设的界面,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3 等。应用层直接和应用程序接口并提供常见的网络应用服务,应用层也向第六层表示层发出请求。
上述主要内容来自 维基百科
TCP/IP
TCP/IP 协议族(英语:TCP/IP Protocol Suite,或 TCP/IP Protocols),简称 TCP/IP,名称源自该协议家族的两个核心协议:TCP(Transmission Control Protocol 传输控制协议)和 IP(Internet Protocol 互联网协议)。
TCP/IP 参考模型是一个抽象的分层模型,这个模型中,所有的 TCP/IP 系列网络协议都被归类到 4 个抽象的"层"中。每一抽象层创建在低一层提供的服务上,并且为高一层提供服务。
网络接口层
网络接口层实际上并不是因特网协议组中的一部分,但是它是数据包从一个设备的网络层传输到另外一个设备的网络层的方法。大致可以理解成 OSI 中的 物理层
和 数据连接层
(虽然不完全一致)。
网络互连层
TCP/IP 协议族中的网络互连层(internet layer)在 OSI 模型中叫做网络层(network layer)。
正如最初所定义的,网络层解决在一个单一网络上传输数据包的问题。 随着因特网思想的出现,在这个层上添加附加的功能,也就是将数据从源网络传输到目的网络。
传输层
传输层负责传送文本数据,主要协议是 TCP 协议和 UDP 协议。
-
TCP 传输控制协议(Transmission Control Protocol)
是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。
-
UDP 用户数据包协议(User Datagram Protocol)
是一个简单的面向数据报的传输层协议,UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据报协议)。
应用层
该层包括所有和应用程序协同工作,利用基础网络交换应用程序专用的数据的协议。 应用层是大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。
每一个应用层协议一般都会使用到两个传输层协议之一: 面向连接的 TCP 传输控制协议和无连接的包传输的 UDP 用户数据报文协议。
OSI 和 TCP/IP 的关系大概就如下图:
Socket 在 TCP/IP 中的角色
Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。
socket 通信流程
socket 起源于 UNIX,在 Unix 一切皆文件哲学的思想下,socket 是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket 是"打开—读/写—关闭"模式的实现,以使用 TCP 协议通讯的 socket 为例,其交互流程大概是这样子的:
-
服务器根据地址类型(ipv4,ipv6)、socket 类型、协议创建 socket
-
服务器为 socket 绑定 ip 地址和端口号
-
服务器 socket 监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的 socket 并没有被打开
-
客户端创建 socket
-
客户端打开 socket,根据服务器 ip 地址和端口号试图连接服务器 socket
-
服务器 socket 接收到客户端 socket 请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候 socket 进入阻塞状态,所谓阻塞即接收方法一直到客户端返回连接信息后才返回,开始接收下一个客户端请求。
-
客户端连接成功,向服务器发送连接状态信息
-
服务器接收方法返回,连接成功
-
客户端向 socket 写入信息
-
服务器读取信息
-
客户端关闭
-
服务器端关闭
三次握手
在 TCP/IP 协议中,TCP 协议通过三次握手建立一个可靠的连接,服务器 socket 与客户端 socket 建立连接的部分其实就是靠 TCP 三次握手来实现。
-
第一次握手:客户端尝试连接服务器,向服务器发送 syn 包(同步序列编号 Synchronize Sequence Numbers),syn=j,客户端进入 SYN_SEND 状态等待服务器确认。
-
第二次握手:服务器接收客户端 syn 包并确认(ack=j+1),同时向客户端发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
-
第三次握手:第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。