TCP连接建立

 

TCP的开放握手也称为 3 次握手( 3 way handshake ),因为这通常包括 3 条消息:一条从 客户端到服务器端的 连接请求 ,一条从 服务器端到客户端的确认信息 ,以及另一条从 客户端到服务器端的确认消息

 

Socket构造函数的调用与客户端连接建立时所关联的协议事件之间的关系:


TCP连接建立

客户端一收到服务器端发来的确认信息,就立即认为连接已经成功建立。

互联网是一种尽力而为(best effort )的网络,客户端的起始消息或服务器端的回复消息都可能在传输过程中丢失。出于这个原因, TCP 协议实现将以递增的时间间隔重复发送几次握手消息。如果 TCP 客户端在一段时间后还没有收到服务器的返回消息,则发生超时并放弃连接。这种情况下,构造函数将抛出 IOException 异常。连接的超时通常比较长,因此要经过几分钟的时间 Socket 构造函数才会失败。

 

 

SYN_SENT ”是在第一条和第二条握手消息之间,客户端状态的专业名称。

 

客户端底层的数据结构:
 
TCP连接建立

 

服务器Socket 启动:

TCP连接建立

 

当客户端的连接请求到来时,将为该连接创建一个新的套接字数据结构。新套接字的地址根据到来的分组报文设置:分组报文的目标互联网地址和端口号(分别为w.x.y.z q )成为该套接字的本地还联网地址和端口号;分组报文的源地址和端口号( a.b.c.d:p )则成为该套接字的远程互联网地址和端口号。注意:新套接字的本地端口号总是与 ServerSocket 的端口号一致。新套接字的状态设置为指示“正在连接( Connecting )”(在服务器方,专业术语称为 SYN_RCVD ),并将其添加到 ServerSocket 套接字数据结构所关联的一个未完全连接的套接字列表中。注意: ServerSocket 自己并不改变状态,其地址信息也不会有任何改变。

除了创建一个新的底层套接字数据结构外,服务器的TCP 实现还要向客户端发回一个 TCP 握手确认信息。


TCP连接建立

 

在接收到客户端发来的3 次握手的第 3 条消息之前,服务器端的 TCP 并不会认为握手消息已经完成。第 3 条握手信息到来后,新数据结构的状态则设置为“ ESTABLISHED ”,并将其移动到 ServerSocket 数据结构关联的另一个套接字数据结构列表中,该列表代表了能够通过 ServerSocket accept() 方法进行接收的已成功建立连接。(如果第 3 条握手消息接收失败,最终会将“ Connecting ”状态的数据结构删除。)

 

服务器程序调用了ServerSocket accept() 方法后,只要其关联的套接字数据结构列表中有新的连接到来,该方法调用就立即停止阻塞。(注意,在调用 accept() 方法时,这个列表可能已经是非空状态。)此时,一个新的连接数据结构将从列表中移出,并为其创建一个 Sokcet 实例,作为 accept() 方法的返回值。


TCP连接建立

 

 

 

 

 

你可能感兴趣的:(tcp)