三次握手建立連接
第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。
四次握手斷開:
由於 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務后就能發送一個FIN 來終止這個方向的發送通道。收到一個 FIN 只意味着這一方向上沒有數據流動,一個 TCP 連接在收到一個 FIN 后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
( 1 )客戶端 A 發送一個 FIN ,用來關閉客戶 A 到服務器 B 的數據傳送(報文段 4 )。
( 2 )服務器 B 收到這個 FIN ,它發回一個 ACK ,確認序號為收到的序號加 1 (報文段 5 )。和 SYN 一樣,一個FIN 將占用一個序號。
( 3 )服務器 B 關閉與客戶端 A 的連接,發送一個 FIN 給客戶端 A (報文段 6 )。
( 1 )客戶端 A 發送一個 FIN ,用來關閉客戶 A 到服務器 B 的數據傳送(報文段 4 )。
( 2 )服務器 B 收到這個 FIN ,它發回一個 ACK ,確認序號為收到的序號加 1 (報文段 5 )。和 SYN 一樣,一個FIN 將占用一個序號。
( 3 )服務器 B 關閉與客戶端 A 的連接,發送一個 FIN 給客戶端 A (報文段 6 )。
( 4 )客戶端 A 發回 ACK 報文確認,並將確認序號設置為收到序號加 1 (報文段 7 )。
問題1: 為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?
這是因為服務端的 LISTEN 狀態下的 SOCKET 當收 到 SYN 報文的建立連接請求后,它可以把 ACK 和 SYN ( ACK 起應答作用,而 SYN 起同步作用)放在一個報文里來發送。但關閉連接時, 當收到對方的 FIN 報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉 SOCKET, 也即你可能還需要發送一些數據給對方之后,再發送 FIN 報文給對方來表示你同意現在可以關閉連接了,所以它這里的 ACK 報文 和 FIN報文多數情況下都是分開發送的。
HTTP 請求響應常見狀態碼
100~199:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程。
200~299:表示成功接收請求並已完成整個處理過程。常用200
300~399:為完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、常用302(意味着你請求我,我讓你去找別人),307和304(我不給你這個資源,自己拿緩存)
400~499:客戶端的請求有錯誤,常用404(意味着你請求的資源在web服務器中沒有)403(服務器拒絕訪問,權限不夠)
200~299:表示成功接收請求並已完成整個處理過程。常用200
300~399:為完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、常用302(意味着你請求我,我讓你去找別人),307和304(我不給你這個資源,自己拿緩存)
400~499:客戶端的請求有錯誤,常用404(意味着你請求的資源在web服務器中沒有)403(服務器拒絕訪問,權限不夠)
500~599:服務器端出現錯誤,常用500