Socket编程
Socket(套接字)编程是众多c/s架构程序基础,游戏、web服务器、绝大多数的木马程序都是基于Socket来实现的。
国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。
除了标准的OSI七层模型以外,常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议,它们之间的对应关系如下图所示:



- 应用层:提供用户接口,特指网络应用程序,能产生网络流量的应用程序,比如客 户端的 QQ、浏览器等,服务器端的 Web 服务、流媒体服务等。而 Windows记事本程序和计算器程序由于不产生网络流量,所以它们不属于应用层。
- 表示层:表示数据,如采用二进制或 ASCII 码等;处理数据,如数据加密、数据 压缩等。这一层常常是软件开发人员需要考虑的问题。比如 QQ 软件开发人员就要 考虑用户的聊天记录在网络传输之前加密,防止有人使用捕包工具捕获用户数据, 泄露信息;针对 QQ 视频聊天,开发人员就要考虑如何通过压缩数据节省网络带宽。
- 会话层:会话层的作用主要是建立、维护、管理应用程序之间的会话。比如流媒体 服务器和每一个点播节目的客户端软件分别建立会话,服务器才能区分每个用户点 播的节目和相应进度。
- 传输层:提供可靠或不可靠的传输,能够错误纠正,纠正失败能够重传。传输层的 可靠传输负责建立端到端的连接,并负责数据在端到端连接上的传输。传输层通过 端口号区分上层服务,并通过滑动窗口技术实现可靠传输、流量控制、拥塞控制以 及通过三次握手建立连接。
- 网络层:为网络设备提供逻辑地址,根据数据包的逻辑地址选择最佳网络路径。负 责数据从源端发送到目的端,负责数据传输的寻径和转发。
- 数据链路层:也经常被人们称为 MAC 层,它管理网络设备的物理地址,所以物理 地址也被称作 MAC 地址。数据链路层将数据包封装为帧,使用 MAC 地址提供对 介质的访问,执行差错检测,但不纠正。数据链路层向上提供对网络层的服务。
- 物理层:主要负责二进制数据比特流在设备之间的传输。物理层规定电压大小、线路速率、设备和电缆的接口标准。
物理层关心的是以下一些内容:
♦ 接口和媒体的物理特性。
♦ 位的表示和传输速率。
♦ 位的同步。
♦ 物理拓扑:星状拓扑、环状拓扑、总线拓扑等。
♦ 传输模式:单工、半双工或全双工。
注:
(1)流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送;如果不使用此技术,就必须在使用前下载整个媒体文件。流式传输可传送现场影音或预存于服务器上的影片,当观看者在收看这些影音文件时,影音数据在送达观看者的计算机后立即由特定播放软件播放。
(2)OSI 参考模型中底层为其上层提供服务,因此排错也应该从底层到高层依次排错。

- 上面 3 层为 OSI 的高层,主要面向用户应用,定义了终端系统中的应用程序将如何彼此 通信,以及如何与用户通信。软件开发人员在开发应用程序时需要考虑 OSI 上面 3 层,不必 要考虑数据通信方面的事情。
- 下面 4 层为 OSI 的底层,主要面向数据传输,定义了怎样进行端到端的数据传输。网络 工程师的工作主要涉及 OSI 参考模型的下面 4 层。网络工程师负责把网络调通、优化后,就 可以为多种应用程序提供网络通信。
四层模型和五层是现实世界中真实存在的,这里所说的内容集中在网络接口层,实际对应到5层的数据链路层。
Socket(套接字)是一种编程接口,一般面向网络层和传输层协议(套接字并不限于TCP/IP),每个套接字绑定一个ip一个端口。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。比如QQ服务端对外绑定8000端口,web服务器一般对外绑定80端口。
Socket(套接字)为BSD UNIX( 是Unix的衍生系统 )系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳。许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持。
注:
(1)传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
(2)总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
(3)套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。
(4)在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。