分享

TCP建立连接三次握手过程详解(wireshark截图、java socket源码)

 昵称29273511 2015-12-10

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

三次握手协议建立连接图

握手过程步骤如下(配wireshark分析图):


1、客户端发送SYN(SEQ=1022)报文给服务器端,客户端进入SYN_SEND状态。

2、服务器端收到SYN报文,回应一个SYN (SEQ=2032)ACK(ACK=1022+1)报文,服务器段进入SYN_RECV状态。

注意:服务器根据syn=1判断客户端请求建立连接,返回ack=1



3、客户端收到服务器端的SYN报文,回应一个ACK(ACK=2032+1)报文,进入Established状态。

注意:确认ack number是否与第一次发送(seq number+1)相等,并ack=1。正确,发送ack number = seq number(服务器顺序编号)+1


服务器端:确认ack number是否与第一次发送(seq number+1)相等,并ack=1。正确,连接建立

连接建立完成,可以传送数据了。

java测试源码(只有握手部分)

服务器代码:

package com.wangshihai.util;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/** * * @ClassName: TCPServerSocket* @Description: TODO(tcp server socket类型)* @author 技术杂货铺 wangshihai.com* @date 2015年7月25日 上午8:49:54* */public class TCPServerSocket {	private static ServerSocket serverSocket;	private static Socket socket;	/**	 * 	* @Title: startServerSocket 	* @Description: TODO(根据端口,绑定本机地址,建立serversocket) 	* @param @param bindPort    绑定端口	* @param @param bindIp      绑定地址	* @param @param blocknumber 允许客户端连接的个数 	* @return void    返回类型 	* @throws	 */	public static void startServerSocket(int bindPort,String bindIp,int blocknumer){		try {			serverSocket = new ServerSocket(bindPort,blocknumer,InetAddress.getByName(bindIp));			socket = serverSocket.accept();			System.out.println('连接的客户端地址和端口为:'+socket.getRemoteSocketAddress());		} catch (IOException e) {			e.printStackTrace();		}	}		/**	 * 	* @Title: main 	* @Description: TODO(测试防范) 	* @param @param args    设定文件 	* @return void    返回类型 	* @throws	 */	public static void main(String[] args) {		startServerSocket(6000,'192.168.2.100',3);	}}


客户端代码:

package com.wangshihai.util;import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/** * * @ClassName: TCPClientSocket* @Description: TODO(连接server socket 工具类)* @author 技术杂货铺 wangshihai.com* @date 2015年7月25日 上午9:17:33* */public class TCPClientSocket {	private static Socket socket;	/**	 * 	* @Title: connectServerSocket 	* @Description: TODO(根据服务器的IP和端口,建立socket连接) 	* @param @param bindPort 访问的服务器端口 	* @return void    返回类型 	* @throws	 */	public static void connectServerSocket(int bindPort){		InetAddress inetAddress;		try {			//根据字符串IP获取inetaddress对象			inetAddress = InetAddress.getByName('192.168.2.100');			socket = new Socket(inetAddress, bindPort);		} catch (UnknownHostException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}			}		/**	 * 	* @Title: main 	* @Description: TODO(测试方法) 	* @param @param args    设定文件 	* @return void    返回类型 	* @throws	 */	public static void main(String[] args) {		int bindPort = 6000;		connectServerSocket( bindPort);	}} 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多