前言:
在Socket实例返回时(通过Socket公有构造函数,或者调用ServerSocket.accept( )方法),它就已经连接到一个远程终端,并通过协议的底层实现完成了TCP消息或握手信息的交换。
TCP连接:
1.TCP的开放握手:
TCP的开放握手也称为3次握手,因为这通常包括三条消息:
第一条:从客户端到服务端的连接请求;
第二条:从服务端到客户端的确认消息;
第三条:从客户端到服务端的确认消息;
这样客户端与服务端就已经成功建立了连接,通常这个过程发生得很快。然而,互联网是一种“尽力而为”的网络,TCP协议将以递增的时间间隔重复发送几次握手消息。如果TCP客户端在一段时间后还没有收到服务端的回复消息,则发生超时并放弃连接。这种情况下,Socket构造函数将抛出IOException异常。
注意:TCP连接的超时通常时间比较长,因此要经过几分钟Socket构造函数才会抛出异常;
2.连接剖析
下面将介绍“客户端建立连接”与“服务端建立连接”的过程,其中,客户端的IP表示为:A.B.C.D,服务端的IP表示为:W.X.YZ,端口表示为:Q
(1)客户端连接建立
如果在调用构造函数时,客户端没有指定本地IP和端口,底层实现则将向服务端发送数据报文的网络接口地址作为本地IP,同时选择一个没有被其它TCP套接字使用的本地端口(P)
(2)服务端套接字设置
服务器首先创建一个ServerSocket实例,并将其与已知端口相关联(Q),套接字实现为新的ServerSocket实例创建了一个底层数据结构,并将Q赋给本地端口,将特定的通配符地址(图中为“*”)赋给本地IP地址。(服务器也可能在构造函数中指定一个本地IP地址,但是通常不这样做。对于服务器主机有多个IP地址的情况,不指定本地地址能够接收发送到该服务器主机任何地址的连接请求)
(3)服务端确认握手消息
除了要设置服务端套接字外(创建一个新的底层套接字数据结构),服务器还要向客户端发回一个TCP握手确认消息。
(4)服务端accept( )处理
注意:在ServerSocket关联的列表中每个数据结构,都代表了一个与客户端已经完成建立的TCP连接。