TCP(Transmission Control Protocol)是在网路层的一种面向连接的通信协议。
TCP协议会在网路通信的两端各建立Socket对象,通信前要保证连接已建立。TCP是通过Socket产生IO流来进行网路通信的。
TCP连接的建立是通过三次挥手进行的。通过三次挥手的过程,客户端和服务器建立基于TCP协议的通信连接。
三次握手原理:
第1次握手: 客户端Client发送一个带有SYN(synchronize)的数据包给服务器Server
第2次握手: 服务器回复带有SYN和ACK(acknowledge)的数据包返回给客户端
第3次握手: 客户端回复ACK数据包给服务器,完成通信连接
在TCP通信结束之后,客户端想与服务器断开连接,则会通过四次握手来断开连接并清除在连接管道中的所有数据。
四次挥手原理:
第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;
第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态;
第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;
第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
————————————————
版权声明:本文为CSDN博主「不脱发的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38106923/article/details/108292454
Java实现
使用Java实现TCP的简单通信,首先在客户端中创建一个Socket对象,服务器地址为127.0.0.1,端口号是10000:
Socket socket = new Socket("127.0.0.1", 10000);
然后从连接通道中获取输出流,并写出数据:
OutputStream os = socket.getOutputStream();
os.write("你好啊".getBytes());
最后释放资源:
os.close();
socket.close();
紧接着是服务器端中,创建一个ServerSocket对象,端口号与客户端发送的端口号一致:
ServerSocket ss = new ServerSocket(10000);
然后用ServerSocket对象监听客户端连接,并保存结果至Socket对象中:
Socket socket = ss.accept();
下一步使用缓冲流将输入流的数据读取,并打印数据:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int b;
while ((b = br.read()) != -1) {
System.out.print((char) b);
}
最后是释放资源:
socket.close();
ss.close();