TCP三次握手和四次挥手详解:Java代码逐行翻译
public class Client { int port = 8888; String ip = 'localhost'; DataInputStream di = null; DataOutputStream dou = null; Socket client = null; // socket 通常也称作'套接字',用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过'套接字'向网络发出请求或者应答网络请求。
// 构造TCP报文段
String seq = null;// 序号
String SYN = null;//请求同步
String ack = null;//返回的确认号
String ACK = null;// 确认同步
String fin = '1';// fin=1时此报文段的发送方的数据已经发送完毕,并要求释放连接
String serverSYN,serverACK,serverseq,serverack;
String RecACK2,Recseq2,Recack2,Recfin3,Recseq3,Recack3;
//初始化Socket
public Client() throws UnknownHostException, IOException {
client = new Socket(ip, port);
run();
}
//将seq取出并+1形成ack
public String seqTransferAck(String s) {
String result = null;
int i = Integer.parseInt(s);
i = i + 1;
result = String.valueOf(i);
return result;
}
//客户端向服务器发送相关消息
public void run() throws IOException {
di = new DataInputStream(client.getInputStream());
dou = new DataOutputStream(client.getOutputStream());
//第一次握手,客户端向服务器发送的数据。seq=随机数 SYN=1 ACK=0
seq = new Random().nextInt(1000)+"";
ack = "0";
SYN = "1";
ACK = "0";
//将要发给服务器的数据写入到数据输出流中
dou.writeUTF(SYN);
dou.writeUTF(ACK);
dou.writeUTF(seq);
}
public String[] secendhand() throws Exception{
di = new DataInputStream(client.getInputStream());
dou = new DataOutputStream(client.getOutputStream());
//第二次握手,读取来自服务器的数据
String str[] = new String[4];
serverSYN = di.readUTF();// SYN
serverACK = di.readUTF();// ACK
serverseq = di.readUTF();// seq
serverack = di.readUTF();//
str[0] = serverSYN;
str[1] = serverACK;
str[2] = serverseq;
str[3] = serverack;
return str;
}
public void secendPrint()throws Exception{
System.out.println("第二次握手");
System.out.println("从服务器端收到的ACK=" + serverSYN);
System.out.println("从服务器端收到的SYN=" + serverACK);
System.out.println("从服务器端收到的seq=" + serverseq);
System.out.println("从服务器端收到的ack=" + serverack);
//第三次握手,客户端向服务器发送的数据。设seq=serverack SYN=0 ACK=1 ack=seqTransferAck(serverseq)
ACK = "1";
SYN = "0";
ack = seqTransferAck(serverseq);
dou.writeUTF(ACK);
dou.writeUTF(SYN);
dou.writeUTF(serverack);
dou.writeUTF(ack);
}
//[start] 四次挥手
/**
* TCP拆除连接的四次挥手过程
* 第一次挥手:fin = 1,seq = u
* 第二次挥手:ACK = 1,seq = v ack = u+1
* 第三次挥手:fin = 1,ACK=1,seq = w,ack = u+1
* 第四次挥手:ACK = 1,seq = u+1,ack = w+1
*/
public void fouthsend() throws Exception{
di = new DataInputStream(client.getInputStream());
dou = new DataOutputStream(client.getOutputStream());
seq = new Random().nextInt(1000)+"";
dou.writeUTF(fin);
dou.writeUTF(seq);
}
public String[] fifthhand() throws Exception{
di = new DataInputStream(client.getInputStream());
dou = new DataOutputStream(client.getOutputStream());
String str[] = new String[4];
RecACK2 = di.readUTF();
Recseq2 = di.readUTF();
Recack2 = di.readUTF();
str[0] = RecACK2;
str[1] = Recseq2;
str[2] = Recack2;
return str;
}
public void fifthPrint()throws Exception{
System.out.println("第二次挥手");
System.out.println("从服务器获得的ACK=" + RecACK2);
System.out.println("从服务器获得的seq=" + Recseq2);
System.out.println("从服务器获得的ack=" + Recack2);
}
public String[] sixthhand() throws Exception{
di = new DataInputStream(client.getInputStream());
dou = new DataOutputStream(client.getOutputStream());
String str[] = new String[4];
Recfin3 = di.readUTF();
Recseq3 = di.readUTF();
Recack3 = di.readUTF();
str[0] = Recfin3;
str[1] = Recseq3;
str[2] = Recack3;
return str;
}
public void sixthPrint()throws Exception{
System.out.println("第三次挥手");
System.out.println("从服务器获得的FIN=" + Recfin3);
System.out.println("从服务器获得的seq=" + Recseq3);
System.out.println("从服务器获得的ack=" + Recack3);
String RecACK4 = "1";
String Recseq4 = seqTransferAck(seq);
String Recack4 = seqTransferAck(Recseq3);
dou.writeUTF(RecACK4);
dou.writeUTF(Recseq4);
dou.writeUTF(Recack4);
}
原文地址: https://www.cveoy.top/t/topic/pNO2 著作权归作者所有。请勿转载和采集!