结论
为了实现可靠的数据传输,TCP协议的通信双方,都必须维护一个序列号,以标识发送出去数据包,有哪些已经被对方收到。三次握手的过程就是双方相互告知序列号的起始值,并确认对方已经收到起始值的必经步骤。
如果只有两次,至多只有连接发起方的起始序列号能被确认,另一方的序列号起始值不能被确认。
为什么TCP需要握手
- 为什么TCP需要握手,能不能不握手?
对比UDP和TCP通信流程,可以发现,在UCP协议中,是没有握手这个操作的。这就引起TCP和UDP的一个基本区别。
- TCP是可靠通信协议:接收方收到的数据是完整、有序、无差错的。
- UDP不可靠传输:接收方收到的数据可能存在丢失,顺序也不一定能保证。
为什么TCP能实现可靠传输,UDP不能?
TCP为了实现可靠传输,通信双方需要判断自己已经发送的数据包能否被接收方收到,如果没有收到,就需要重发。为了实现这个需求,很自然的引出序号(SYN)建立连接和确认号ACK。
为什么是三次握手
为了实现可靠传输,发送方和接收方始终需要同步SYN序号,注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 , 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。
为什么是四次挥手?
因为TCP通信是全双工通信。
要实现可靠的连接关闭
A发请求断开,发送结束报文FIN
B确认A的断开。但是此时A还可以接收数据,B还可以发送数据。B此时不会立即关闭socket,先回复一个ack告诉A我接收到了FIN,等到全部报文发送完了,我再发送FIN。
B请求断开。
A确认B断开。真正的断开连接。