(1)客户端将具有SYN标志的TCP消息发送给服务器。 这是三次握手过程中的信息1。
)2)服务器端响应客户端是三次握手中的第二条消息,该消息同时带有ACK标志和SYN标志。 因此,它表示对刚才的客户端SYN消息的响应; 它还将客户端标记为SYN,并询问客户端是否准备好进行数据通信。
)3)客户必须再次响应服务段的ACK消息。 这是消息段3。
可以通过消息分析TCP的3次握手:
(1)客户端向服务器端发起同步请求,服务器端端口固定为102并且客户端端口通过套接字随机生成
)2)服务器端响应客户端,同时也向客户端发出同步请求
)3)客户端确认
2连接终止协议(挥手4次) ) ) ) ) )。
TCP连接是全双工的,因此必须按方向分别关闭。 它的原则是,一方可以在完成数据发送任务后发送FIN以终止此方向的连接。 接收一个FIN意味着该方向没有数据流,即使一个TCP连接接收到一个FIN也能够发送数据。 首先关闭的一方执行主动关闭,另一方执行被动关闭。
)1) TCP客户端发送FIN以关闭从客户端到服务器的数据传输(消息收发段4 )。
)2)服务器接受此FIN,发回ACK,并确认序列号是接收到的序列号加1 (消息段5 )。 与SYN一样,一个FIN占用一个序列号。
)3)服务器关闭与客户端的连接,向客户端发送FIN ) )第6段)。
)4)段返回并确认ACK消息,并将确认号设置为接收号加1 )段7 )。
Java代码TCP连接的三次握手和四次挥手的过程:
package com.zhaoming.test;
import java.io.BufferedReader;
import java.io.File;
import Java.io.file not found exception;
import java.io.FileOutputStream;
import java.io.IOException;
import Java.io.input streamreader;
import java.io.PrintWriter;
import java.net.Socket;
import Java.net.unknownhostexception;
导入Java.text.simple date format;
import java.util.Date;
publicclassclientconnectextendsthread
{
定义客户端对象
私有客户端;
专用套接字套接字;
//IP和端口号用常数定义
私有身份证明=' 192.168.1.190 ';
私有身份证明端口=20108;
//str声明它是静态变量,
公共静态字符串str=null;
//结构化(具有另一类对象的引用) ) ) ) ) ) ) ) ) ) ) ) )。
公共客户端连接(客户端) )。
{
this.client=client;
}
//启用线程并处理连接
公共语音运行(
{
特里
{
//初始化要连接的套接字
套接字=新套接字(IP,PORT );
client.getjButton1().setenabled ) ) false;
}
catch(unknownhostexceptione1) )
{
E1 .打印堆栈跟踪(;
}
catch(ioexceptionE1) ) )。
{
E1 .打印堆栈跟踪(;
}
//从服务器端通过套接字读取信息
缓冲读取程序br=null;
特里
{
br=newbufferedreader (newinputstreamreader (socket.get inputstream () );
//将读取的信息显示在TextArea中
是wile (真)
{
str=br.readLine (;
client.getjTextArea1().append(str'n ' );
//创建用于存储从服务器读取的信息的新文档
文件文件=new file (e :/tempera true.txt );
打印机写入器out=null;
字符串日期=null;
修改//时间显示的格式
简单日期格式SDF=null;
特里
{
//将读取的信息写入文本文件进行保存
out=新打印机(新文件输出流)文件,true );
SDF=newsimpledateformat (yyyy-mm-ddhh : mm : ss );
date=SDF.format (新日期) );
out.println(date't'str );
out.flush (;
}
文件基础知识(catch ) )。
{
e .打印堆栈跟踪(;
}
金融
{
out.close (;
}
}
}是}catch(ioexceptione )
{
e .打印堆栈跟踪(;
}
//进行流程关闭处理,判断后关闭
金融
{
特里
{
if(br!=空)
{
br.close (;
br=null;
}
if (插座!=空)
{
socket.close (;
套接字=null;
}
}
catch(ioexceptione ) )。
{
e .打印堆栈跟踪(;
}
}
}
}
TCP连接是全双工的,因此必须按方向分别关闭。 它的原则是,一方可以在完成数据发送任务后发送FIN以终止此方向的连接。 接收一个FIN意味着该方向没有数据流,即使一个TCP连接接收到一个FIN也能够发送数据。 首先关闭的一方执行主动关闭,另一方执行被动关闭。 TCP协议的连接是全双工连接,在一个TCP连接上存在双向读写信道。 简而言之,就是“先闭读,后闭写”,一共需要四个阶段。 例如,如果客户端开始关闭连接,则1 .服务器读取通道关闭、2 .客户端写入通道关闭、3 .客户端读取通道关闭、4 .服务器写入通道关闭操作在接收对方发送的FIN并接收到对方确认ACK之前,双方的数据通信完全结束,每次中途接收时都需要返回确认数据段ACK。