【Java TCP/IP Soket】— 剖析TCP套接字连接
2013-12-19 14:19
302 查看
前言:
在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连接。
在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连接。
相关文章推荐
- 【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期
- 【Java TCP/IP Soket】— TCP套接字的基本使用
- 《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期
- 【Java TCP/IP Soket】— UDP套接字的基本使用
- [原]《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期
- 【Java TCP/IP Soket】— 剖析TCP中的死锁
- 【Java TCP/IP Soket】— 套接字简介
- [原]《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期
- 【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期
- 【Java TCP/IP Soket】— 剖析TCP中的缓冲
- Dug小结-java 连接SqlServer2005 com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败
- Java TCP/IP Socket——深入剖析socket—数据传输的底层实现
- Java网络编程(一) TCP/IP,http,socket,长连接,短连接
- Java连接SQLServer时”到主机 的 TCP/IP 连接失败“
- sqlserver2005:到主机 的 TCP/IP 连接失败。 java.net.ConnectException
- om.microsoft.sqlserver.jdbc.SQLServerException: 到主机的TCP/IP 连接失败。java.net.ConnectException: Connectio
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- 【Java】【FAQ】Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败
- com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.NoRouteToHostException
- 【转】Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败