TCP通信就像谈恋爱
TCP通信就跟谈对象一样就像这样:
sequenceDiagram
participant boy
participant girl
opt connect
note over boy,girl:双方三次握手连接确定关系
boy->>girl:小姐姐谈对象吗🥰?
girl->>boy:好啊,确定关系啊😘?
boy->>girl:好啊🤗.
end
loop transfer
note over boy,girl:双方交谈
girl->>boy:你真漂亮啊,送你花花🌹
boy->>girl:😊,谢谢
note over boy,girl:双方产生矛盾
boy->>girl:那个girl真漂亮😍
girl->>boy:那你跟她在一起吧😤
end
opt disconnect
note over boy,girl:四次挥手进行分手仪式
boy->>girl:那现在就分手吧😒
girl->>boy:嗯嗯
girl->>boy:我同意现在分手(😌谋划已久)
boy->>girl:嗯嗯
end
哈哈娱乐一下,下面进行TCP的通信过程讲解(真的很像的,哈哈)。
常用的TCP标志位,有3个:SYN(synchronous,同步位) ,ACK(acknowledgement,确认位) ,FIN(finish,停止位)
两个常用号码为:Acknowledge numbe(确认号),Sequence number(顺序号)
值得注意的是mss(Maximum Segment Size,最大报文长度,每次传输的最大值)经常使用默认值1460。
第一部分:建立连接操作
- 客户端向服务端发送SYN标志,表示想要建立链接,同时发送己方确认号1000和最大传输报文长度1460
- 服务端向客户端回复SYN标志,表示可以建立链接,同时发送己方确认号5000和由对方确认号得到的顺序号5001,最大传输报文长度1024
- 客户端向服务端发送确认号 5001
sequenceDiagram
participant client
participant sever
opt connect
note over client,sever:三次握手连接确定双方信息
client->>sever:SYN,1000(0),<mss 1460>
sever->>client:SYN,5000(0),ACK 1001,<mss 1024>
client->>sever:ACK 5001
end
第二部分:循环传输
- 服务端向客户端发送确认号1001和顺序号5001,并传输198个字节数据。
- 客户端向服务端发送确认号5199和顺序号1001,并,传输20个字节数据。
- 客户端向服务端发送确认号 1021
sequenceDiagram
participant client
participant sever
loop transfer
note over client,sever:sever向client传输198个字节数据
sever->>client:5001(198),ACK 1001
note over client,sever:client向sever传输20个字节数据
client->>sever:1001(20),ACK 5199
sever->>client:ACK 1021
end
第三部分:断开连接操作
- 客户端向服务端发送FIN标志,表示想要断开链接,同时发送确认号5199和序列号1021
- 服务端向客户端发送确认号 1022
- 服务端向客户端回复发送FIN标志,表示可以断开链接,同时发送确认号1022和序列号5199
- 客户端向服务端发送确认号 5200
sequenceDiagram
participant client
participant sever
opt disconnect
note over client,sever:四次挥手断开,每个方向单独断开
client->>sever:FIN,1021(0),ACK 5199
sever->>client:ACK 1022
sever->>client:FIN,5199(0),ACK 1022
client->>sever:ACK 5200
end
TCP的通信全过程甘特图展示
sequenceDiagram
participant client
participant sever
opt connect
note over client,sever:三次握手连接确定双方信息
client->>sever:SYN,1000(0),<mss 1460>
sever->>client:SYN,5000(0),ACK 1001,<mss 1024>
client->>sever:ACK 5001
end
loop transfer
note over client,sever:sever向client传输198个字节数据
sever->>client:5001(198),ACK 1001
note over client,sever:client向sever传输20个字节数据
client->>sever:1001(20),ACK 5199
sever->>client:ACK 1021
end
opt disconnect
note over client,sever:四次挥手断开,每个方向单独断开
client->>sever:FIN,1021(0),ACK 5199
sever->>client:ACK 1022
sever->>client:FIN,5199(0),ACK 1022
client->>sever:ACK 5200
end
任世事无常,勿忘初心