技能树-网络-TCP

2018-03-18  本文已影响12人  6faef730638b

必备知识:

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);  
上一篇下一篇

猜你喜欢

热点阅读