當我們向服務器發送HTTP請求,獲取數據、修改信息時,都需要建立TCP連接,包括三次握手,四次分手。
什么是TCP連接?
為實現數據的可靠傳輸,TCP要在應用進程間建立傳輸連接。它是在兩個傳輸用戶之間建立一種邏輯聯系,使得通信雙方都確認對方為自己的傳輸連接端點。
建立連接
建立連接前,服務器端首先被動打開其熟知的端口,對端口進行偵聽。當客戶端要和服務器端建立連接時,發起一個主動打開端口的請求(該端口一般為臨時端口);然后進入三次握手的過程。
三次握手的過程:
如圖1:
① A 的 TCP 向 B 發出連接請求報文段,其首部中的同步比特 SYN 應置為1,並選擇序號 x,表明傳送數據時的第一個數據字節的序號是 x(設置初始段序號SEQ = x ,例如SEQ = 26 500)。
② B 的 TCP 收到連接請求報文段后,如同意,則發回確認。
B 在確認報文段中應將 SYN 置為 1,其確認號ACK應為 x + 1(ACK 26 501),同時也給出自己的選擇序號 y(設置初始段序號SEQ = y ,例如SEQ = 29 010)。
③ A 收到此報文段后,向 B 給出確認,其確認號應為 y + 1(ACK = 29011)。
A 的 TCP 通知上層應用進程,連接已經建立。
當運行服務器進程的主機 B 的 TCP 收到主機 A 的確認后,也通知其上層應用進程,連接已經建立。
由於客戶對報文段進行了編號,它知道哪些序號是期待的,哪些序號是過時的。當客戶發現報文段的序號是一個過時的序號時,就會拒絕該報文段,這樣就不會造成重復連接。
釋放連接
數據傳輸結束后,通信雙方都可以釋放連接。
四次分手的過程:
如圖2:
過程① 結束時,從 A 到 B 的連接就釋放了,連接處於半關閉狀態。
相當於 A 向 B 說:“我已經沒有數據要發送了。但你如果還發送數據,我仍接收。”
過程② 結束后,至此,整個連接已全部釋放。
TCP的半關閉
TCP提供了連接的一端在結束它的發送后還能接收來自另一端數據的能力。這就是所謂的半關閉。圖3顯示了一個半關閉的典型例子。讓左方的客戶端開始半關閉,當然也可以由另一端開始。初始端發出的FIN,接着是另一端對這個FIN的ACK報文段。接收半關閉的一方仍能發送數據。當收到半關閉的一端在完成它的數據傳送后,將發送一個FIN關閉這個方向的連接,這將傳送一個文件結束符給發起這個半關閉的應用進程。當對第二個F I N進行確認后,這個連接便徹底關閉了。