美文网首页
技能树-网络-TCP

技能树-网络-TCP

作者: 6faef730638b | 来源:发表于2018-03-18 00:43 被阅读12次

    必备知识:

    SYN :请求报文 是TCP/IP建立连接时使用的握手信号
    ACK :确认字符
    FIN :释放报文
    seq: 序号
    ack :等待接收的数据包的序列号


    TCP协议

    是一种面向连接的、可靠的、基于字节流的传输层通信协议

    提供功能
    1.可靠传输
    -1.1滑动窗口
    -1.2超时重传
    -1.3选择确认
    2.流量控制
    -2.1滑动窗口
    3.拥塞控制
    -3.1慢开始
    -3.2拥塞避免
    -3.3快重传
    -3.4快恢复

    这里我们不对上面的内容进行详细的讲解 若是考研或者想深入研究的建议看谢希仁的计算机网络最新版

    TCP连接

    图解与文字解释

    提问

    1:建立tcp连接为什么需要三次握手?两次不行吗?

    普通建立连接需要4步 互相发连接报文与确认报文 tcp连接将
    服务端的响应和连接报文一起发放 只需三次即可

    2:释放tcp连接 为什么是四次挥手 ?为什么不像连接一样需要三次

    这是因为服务端在三次握手时候,把ACK和SYN放在一个报文里发送给客户端。
    而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    Socket

    Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个API,通过Socket,我们才能使用TCP/IP协议。

    Socket套接字=IP+PORT

    Socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉,但是由于各种环境因素可能会是连接断开
    当一个Socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的,若没有及时接受到心跳返回,重新建立连接

    通信模型

    服务端

    1.创建serversocket 并循环accept()等待接受请求
    2.接受到连接后创建相应服务的socket连接
    3.数据流式传输交互
    4.socket.close()

    public class SocketServer {  
        //监听端口号  
        private static final int SERVER_PORT = 12345;  
        public static void main(String[] args) {  
            try {  
                System.out.println("Server: Connecting...");  
                ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  
                while (true) {  
                    //循环监听客户端请求  
                    Socket clientSocket = serverSocket.accept();  
                    System.out.println("Server: Receiving...");  
                    try {  
                        //获取输入流  
                        BufferedReader in = new BufferedReader(  
                                new InputStreamReader(clientSocket.getInputStream()));  
                        //获取从客户端发来的信息  
                        String str = in.readLine();  
                        System.out.println("Server: Received: '" + str + "'");  
                    } catch (Exception e) {  
                        System.out.println("Server: Error");  
                        e.printStackTrace();  
                    } finally {  
                        clientSocket.close();  
                        System.out.println("Server: Close.");  
                    }  
                }  
      
            } catch (Exception e) {  
                System.out.println("Server: Error");  
                e.printStackTrace();  
            }  
        }  
    }  
    

    客户端

    1.创建连接socket 向serversocket发出请求
    2.数据流式传输交互
    3.socket.close()

    Socket socket = new Socket("192.168.1.104", 12345);  
    //发送给服务端的消息  
    String message = "Message from Android phone"; 
     //第二个参数为True则为自动flush  
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  
    socket.getOutputStream())), true);  
    

    相关文章

      网友评论

          本文标题:技能树-网络-TCP

          本文链接:https://www.haomeiwen.com/subject/hwrrqftx.html