在使用TCP进行服务端与客户端进行通信连接时,需要进行3次 "握手",3次"握手" 也是学习Socket的必备知识,当然也是在很多面试中会问到的。今天我只做个文章的搬运工,以下所有内容都是出自<NIO与Socket编程指南>一书中。客户端与服务端代码如下图
首先运行服务端,再运行客户端,在wirkshark工具中捕获完整的通信过程,结果如下图
其中三次握手的过程如下图
第一次握手的信息如下图:
在"第一次握手"的过程中,客户端向服务端发送一个SYN的标志位,目的是为了与服务端进行连接。
SYN标志位的值表示发送数据流序号sequence number的最大值,例如,Seq=5,说明在数据流中一共传输了4个字节,而在本次握手中,Seq=0,说明发送的数据流大小是0,也就是客户端在第一次握手没有发送数据包给服务端,只是为了与服务端建立连接。
第二次握手的信息如下图:
在第二次握手时,服务端发送了SYN和ACK标志位,其中ACK标志位表示对收到的数据包的确认,说明服务端收到了客户端的连接请求,ACK=1,表示服务端希望下次从客户端发送数据流的序号是1,而Seq=0代表服务端并没有给客户端发送数据。
第三次握手信息如下图:
客户端向服务端发送Ack=1,Seq=1, Seq=1代表这正是服务端所期望的Ack=1。虽然Seq=1,但是Len=0说明客户端还是没有向服务端发送数据,而客户端向服务端发送Ack标志位为1的信息,说明客户端期待服务端下一次传送的Seq=1。
整体流程可以是:
1:客户端->服务端:我要连接
2:服务端->客户端:好的,已经连接上了
3:客户端->服务端:收到,确认已经连接上了
在连接之后进行数据传输的信息如下图:
在客户端第一次向服务端发送数据时,Seq=1代表服务端希望客户端下次发送的数据流序号=1,Len=3表示这次传输的数据大小。 服务端收到消息之后又发送了Ack标志,表示下次服务端希望客户端发送的数据流序号是4,也就是之前的 1+3。后面的传输以此类推即可。