1.2 网络连接的端点:Socket
图1-6 Socket示意图
1.2.1 Socket
网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为一个Socket。一个Socket包含了进行网络通信必需的五种信息:连接使用的协议、本地主机的IP地址、本地的协议端口、远程主机的IP地址和远程协议端口(如图1-6所示)。如果把Socket理解成一台手机,那么本地主机IP地址和端口相当于自己的手机号码,远程主机IP地址和端口相当于对方的号码。至少需要两台手机才能打电话,同样地,至少需要两个Socket才能进行网络通信。
1.2.2 IP地址
网络上的计算机都是通过IP地址识别的,应用程序通过通信端口彼此通信。通俗地讲,可以理解为每一个IP地址对应于一台计算机(实际上一台计算机可以有多个IP地址,此处仅作方便理解的解释)。在图1-7中,从计算机1的角度看,192.168.1.5是自己的IP,称为“本地IP”。192.168.1.12是别人的IP,称为“远程IP”。
图1-7 IP地址示意图
提示
在Windows命令提示符中输入ipconfig,便能够查看本机的IP地址。图1-8所示计算机的IP地址为192.168.0.105。
图1-8 查看本机IP地址
1.2.3 端口
“端口”是英文port的意译,是设备与外界通信交流的出口。每台计算机可以分配0到65535共65536个端口。通俗地讲,每个Socket连接都是从一台计算机的一个端口连接到另外一台计算机的某个端口,如图1-9所示。
图1-9 端口示意图
端口是个逻辑概念。很久以前,计算机没有“多任务”的概念,也没有“端口”的概念,只需要两台计算机的地址,便能够进行网络通信。就像很久以前,每家每户都住平房,寄信给别人时,只需在信封上写××路××号一样。随着城市的发展,人们都住上了高楼,这时候写信的地址就变成××路××号××层××室。同样的,随着计算机多任务系统的发展,人们定义了“端口”的概念,把不同的网络消息分发给不同的任务。就像写上门牌号能够把信发送到每家每户一样,使用IP和端口也能够把信息发送给对应的任务。
图1-10和表1-2展示了Socket、IP和端口之间的关系。每一个进程(客户端1、客户端2、服务端)可以拥有多个Socket,每个Socket通过不同端口与其他计算机连接。每一条Socket连接代表着本地Socket→本地端口→网络介质→远程端口→远程Socket的链路,例如在计算机1的Socket A通过1000端口连接到计算机2的888端口。值得注意的是,就像打电话分为“呼叫方”和“接听方”一样,Socket通信分也为“连接方”和“监听方”:连接方使用不同的端口连接,监听方只使用一个端口监听。图1-10中Socket E在Socket A连接后产生,代表着Socket A和服务端的连接,Socket F在Socket B连接后产生,代表着Socket B和服务端的连接。
图1-10 Socket连接示意图
表1-2 图1-10中各个Socket的属性
1.2.4 Socket通信的流程
为了能够理解下一节的程序,请务必认真阅读本节。图1-11展示了一套基本的Socket通信流程。这个过程和手机通话很相似,连接方(客户端)和监听方(服务端)有着不同的流程。图1-11中的Socket、Connect、Bind、Listen等词汇指的是Socket通信过程中所需要调用的API,三次握手、四次挥手等词汇指的是操作系统内部的处理过程。
图1-11 Socket通信的基本流程
1)开启一个连接之前,需要创建一个Socket对象(使用API Socket),然后绑定本地使用的端口(使用API Bind)。对服务端而言,绑定的步骤相当于给手机插上SIM卡,确定了“手机号”。对客户端而言,连接时(使用API Connect)会由系统分配端口,可以省去绑定步骤。
2)服务端开启监听(使用API Listen),等待客户端接入。相当于电话开机,等待别人呼叫。
3)客户端连接服务器(使用API Connect),相当于手机拨号。
4)服务器接受连接(使用API Accept),相当于接听电话并说出“喂”。
通过这4个步骤,成功建立连接,可以收发数据。
5)客户端和服务端通过Send和Receive等API收发数据,操作系统会自动完成数据的确认、重传等步骤,确保传输的数据准确无误。
6)某一方关闭连接(使用API Close),操作系统会执行“四次挥手”的步骤,关闭双方连接,相当于挂断电话。
1.2.5 TCP和UDP协议
从概念上讲,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,与TCP相对应的UDP协议是无连接的、不可靠的、但传输效率较高的协议。在本章的语义中,“Socket通信”特指使用TCP协议的Socket通信。
也许能够以寄快递的例子解释不同协议的区别。有些快递公司收费低,对快递员的要求也低,丢件的事情频频发生;有些公司收费高,但要求快递员在每个节点都做检查和记录,丢件率很低。不同快递公司有着不同的行为规则,有的奉行低价优先,有的奉行服务至上。TCP、UDP协议对应不同快递公司的行为规则。它们的目的都是将数据发送给接收方,但使用的策略不同:TCP注重传输的可靠性,确保数据不会丢失,但速度慢;UDP注重传输速度,但不保证所有发送的数据对方都能够收到。至于孰优孰劣,得看具体的应用场景。游戏开发最常用的是TCP协议,所以本书也以TCP为主。