TCP
1.TCP 三次握手与四次分手
三次握手:
-
主机A向主机B 发送随机的seq number, syn 1;
-
主机B 由syn=1 知道主机A想要建立连接, 将seq number加一生成ack number,syn=1,ack=1,重新发送给主机A;
-
主机A 对ack number,syn,ack 进行检测是否正确,如果正确,就将ack number继续加一,生成新的ack number 并发送给主机B,主机B 对ack进行确认之后建立连接成功,三次握手到此结束
seq number 与 ack number 的详解
https://blog.csdn.net/a19881029/article/details/38091243
四次分手:
- 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
- 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
- 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
- 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
握手与分手具体:https://libaineu2004.blog.csdn.net/article/details/79020403
2.TCP 能够实现可靠性传输的原因:
- 三次握手保证连接的可靠性(三次握手包括数据确认,重传,数据校验,数据乱序的处理);
- 数据重复直接丢弃
- 流量控制(滑动窗口):通过cwnd,rwnd来确定当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
- 拥堵控制:当网络拥塞时,减少数据的发送。
流量控制,拥堵控制
3.TCP的使用
java demo
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
//TCP客户端
public class MyClient {
public static void main(String[] args) throws Exception{
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
BufferedReader input = null;
// 请求指定ip和端口号的服务器
socket = new Socket("127.0.0.1",3333);
while(true){
in = new BufferedReader(new InputStreamReader