简单介绍TCP三次握手的那些事

正文

最近墨白在寻找合适的offer,遇到高频面试题,TCP三次握手的原理是什么?离我学习TCP的时间太久了,自我感觉和面试官这方面的交流不是特别优秀哇,于是又学习了一下,今天就给大家聊一聊TCP三次握手的原理以及附上代码操作;

简单概述下TCP:

TCP通信是能够实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

两个端口通信时的步骤:

1. 服务端程序,需要事先启动,等待客户端的连接。

2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

了解完TCP概述以后我们进入今天的主题讲下TCP三次握手的原理,我们知道TCP传输数据是先有服务端在有客户端,比方服务端就相当于大表哥,客户端就相当于小表妹;

大表哥(ServerSocket)自己准备好以后(创建ServerSocket,并监听一个端口),然后创建小表妹;

第一次握手

  • 小表妹需要发送第一次请求,大表哥自然是要同意小表妹的请求,既然同意了请求,:那么大表哥就需要创建一个和小表妹对应的Socket,大表哥的Socket和小表妹的socket对应上以后;

第二次握手

  • 他们就要开始搞事情了,这个时候出现了一个通道(流),小表妹和大表哥可以互通信息了,小表妹这边的流(输出流)叫做getoutputStream(用来写入数据),比方小表妹写入的数据叫做你好,约吗?,通过流传输到大表哥那里,大表哥接受之后是需要读取小表妹给她发送的数据的,那么这个时候大表哥的流也出现了(getInputStream,这个流用来读取数据),既然读取到了数据,就需要给小表妹回消息了;

第三次握手

  • 大表哥用(getoutputStream,输出流)给小表妹回了一个老地方见!,小表妹收到这个数据以后就要读取数据(getInputStream,输入流),这样就完成了TCP通信的三次握手;

代码参考,服务端;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
    TCP服务端实现步骤:
        1.创建服务端ServerSocket,绑定端口号9999
        2.同意客户端的连接
        3.得到输入流,读取数据
        4.得到输出流,写数据
        5.关闭资源
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("墨白启动啦...");
        // 1.创建墨白ServerSocket,绑定端口号9999
        ServerSocket ss = new ServerSocket(9999);
        // 2.同意小柠檬的请求
        Socket socket = ss.accept(); // 阻塞方法

        // 3.得到输入流,读取数据
        InputStream in = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf); // 阻塞方法
        System.out.println("墨白收到: " + new String(buf, 0, len));

        // 4.得到输出流,写数据
        OutputStream out = socket.getOutputStream();
        out.write("老地方见!".getBytes());

        // 5.关闭资源
        out.close();
        in.close();
        socket.close();
        ss.close();
    }
}

客户端:

package com.itheima.demo02TCP练习;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
    TCP客户端实现步骤:
        1.创建客户端Socket连接服务器
        2.得到输出流,写数据
        3.得到输入流,读取数据
        4.关闭资源
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        System.out.println("小柠檬启动啦...");
        // 1.创建小柠檬Socket连接墨白
        Socket socket = new Socket("127.0.0.1", 9999);

        // 2.得到输出流,写数据
        OutputStream out = socket.getOutputStream();
        out.write("你好,约吗?".getBytes());

        // 3.得到输入流,读取数据
        InputStream in = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println("小柠檬收到: " + new String(buf, 0, len));

        // 4.关闭资源
        in.close();
        out.close();
        socket.close();
    }
}

本文分享自微信公众号 - 框架师(mohu121)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券