一个简单的TCP模拟实现(三)

连接

一个简单的TCP模拟实现(三)_第1张图片
抓包实例

如图最上面三行,是抓取的一个三次握手过程:
192.168.1.104是本机,

  1. 首先发送一个[SYN]连接请求,Seq=0
  2. 对等方返回一个[SYN ACK] Seq=0,Ack =1
  3. 本机收到了[SYN ACK] 返回一个[ACK] Seq =1,Ack=1
    Win = 16384、Win=42340 是在连接的过程中告诉对等方能接收的窗口大小

代码

  • Connector 写的一个连接器
public void run() {
        DatagramPacket sendDpk = null;
        DatagramPacket recvDpk = null;

        while (!connectState.isConnected()) {
            //首先发送只有SYN的包
            DataPacket dataPacket = DataPacketFactory.getInstance(MutpConst.SYN_ONLY);
            try {
                sendPackt(cliSocket, dstSocketAddr, dataPacket);
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
                logger.info("线程中断!");
            } catch (IOException e) {
                logger.info("SYN包发送失败!");
                e.printStackTrace();
            }
            if (!connectState.isSynAck()) {
                logger.info("没有收到SYN ACK包");
                logger.info("继续发送SYN包");
                continue;
            }
            dataPacket = DataPacketFactory.getInstance(MutpConst.ACK_ONLY);
            try {
                sendPackt(cliSocket, dstSocketAddr, dataPacket);
                Thread.sleep(2000);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        logger.info("确认连接成功!");
    }

MUTPinterface 是两个接收接口

  • ReceiverHandleInterface
public interface ReceiverHandleInterface {
    //发送方 对应收到的包做处理
    void handle(DataPacket dataPacket,Recevier recevier) throws IOException;
}
  • RecvACKHandleInterface
public interface RecvACKHandleInterface {
    /*void handleAsSYNACK(ConnectState connectState);*/
    //最后一次客户端向服务端发送ACK包,如果服务端接收到 下次也会带上ack
    void handleAsSYNACK(DataPacket dataPacket, Recvtor recvtor);
    int sendSizeLimit = 5;
    int lastACKed = 0;
    int lastSentedByte = 0;

    public int getLastACKed();

    public void setLastACKed(int lastACKed);

    public int getLastSentedByte();

    public void setLastSentedByte(int lastSentedByte);

    public int getSendSizeLimit();

    public void setSendSizeLimit(int sendSizeLimit);

}

RecvACKHandleImpl 实现RecvACKHandleInterface接口,是发送方响应包的请求做出的行为
RecvHandleImpl 实现ReceiverHandleInterface接口,接收方响应包的请求做出的行为

你可能感兴趣的:(一个简单的TCP模拟实现(三))