必备知识:
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);
网友评论