《Computer Networking: A Top-Down Approach》講解TCP那章里有個疑問:為什么TCP需要三次握手而不是兩次?網上看的答案不太符合我的想法,而我的答案是:性能!
首先看下經典的TCP三次握手圖解:
我之前疑惑的一點就是在第1次握手(Client發送連接請求)和第2次握手(Server返回確認信息)后,第3次不就可以直接傳數據了嗎,何必有第3次握手確認?其實從性能方面考慮就能把2次握手排除了:
1.TCP不同于UDP,除了監聽的主socket進程外,對于每個client,Server還會生成各自獨立的socket來通信,而一個socket進程的建立很耗CPU的
2.假如TCP被設計成前2次握手建立連接、第3次就用來傳數據;那么第一次握手時Server就需要建立一個對應此client的socket進程,等第2次握手被client處理完畢,client就直接連接此socket通信了
3.但第一次握手就建立監聽socket進程是很冒險的:假如網絡不好,一個client發送的第一次握手請求很久才到達Server,然后Server在建立了socket通信進城后發送第二次握手回應client,但因為timeout,此時這個握手請求肯定無效,但Server還是為此建立了個socket通信進程,而一個socket進程的建立很耗CPU的,實在是很浪費~甚至黑客發起SYN flood攻擊時,Server這種一次握手建立socket方式會死的更快~
因此,我認為TCP3次握手后才建立socket通信是一種考慮到性能的設計方式