TCP的連線建立
TCP建立連線的過程叫做握手。握手需要在客戶和伺服器之間交換三個TCP報文段。
嘉定主機A執行的是TCP客戶程式,而B執行的是TCP伺服器程式。最初兩端的TCP程式都屬於關閉狀態。假設:A主動開啟連結,B被動開啟連結。
一開始,B的TCP伺服器程式先建立傳輸控制塊,準備接受客戶程式的連線請求。然後伺服器程式就處於收聽狀態,等待客戶的連線請求。如有就做出響應。
A的客戶程式也是首先建立傳輸控制塊TCP。然後,在打算建立TCP連線時,向B發出連線請求報文段,這時首部中的同部位SYN = 1,同時選擇一個初始序號seq = x,TCP規定,SYN報文段不能攜帶資料,但要消耗掉一個序號。這時TCP客戶程式進入同步已傳送狀態。
B收到連線請求報文段後,如同意建立連線,則向A傳送確認。在確認報文段中應把SYN位和ACK為都置為1,確認號是ack = x + 1,同時也為自己選擇一個初始序號seq = y.請注意,這個報文段也不能懈怠資料,但是同樣要消耗掉一個序號。這是伺服器程式進入同步收到狀態。
TCP客戶程式在收到B的確認後,還要給B給出確認。確認報文段的ACK = 1,確認號ack = y + 1,而自己的序號seq = x + 1。TCP的標準規定,ACK報文段可以攜帶資料,但是如果不攜帶資料則不消耗序號。在這種情況下,下一個資料包文段的序號仍是seq = x + 1。這時,TCP的連線已經建立,A進入已建立連線狀態。
當B收到A的確認後,進入已建立連線狀態。
為什麼A最後還要傳送一次確認呢?這主要是為了防止已失效的連線請求報文段突然又傳送到了B,因而產生錯誤。
所謂“已失效的連線請求報文段”是這樣產生的。考慮一種正常情況,A發出連線請求,但因連線請求報文丟失而未確認。於是A重新傳送一次連線請求。後來收到了確認,建立了連線。資料傳輸完畢後就釋放了連線。A共傳送了兩個連線請求報文段,其中一次丟失,第二次到達了B。沒有已丟失的連線報文段。
現在嘉定出現一種異常情況,即A發出的第一個請求報文段並沒有丟失,而是在某些網路節點長時間滯留了,以致延誤到連線釋放以後的某個時間才到達B。本來這事一個早已失效的報文段。但是B收到此失效的連線報文請求後,就誤認為是A發出的一次新的連線請求。於是就向A發出了確認報文段,同意簡歷連線。假定不採用報文握手,那麼只要B發出確認新的連線已經建立了。
由於現在A並沒有建立連線的請求,因此不會理睬A的確認,也不會向B傳送資料。但是B卻以為新的運輸連結已經建立連線了,並一直等待A發來資料。B的許多資源就這樣白白浪費了。
採用三報文握手的辦法,可以放置上述現象發生。例如在剛才的異常情況下,A不會向B的確認發出確認。B由於收不到確認,就知道A並沒有要求建立連線。
相關文章
- 最多能建立多少個 TCP 連線?TCP
- TCP連線是如何建立和終止的?TCP
- 系列TCP/IP協議-TCP建立與終止連線(012)TCP協議
- ? 抓包分析 TCP 建立和斷開連線的流程TCP
- tcp 連線TCP
- TCP連結的建立和釋放TCP
- TCP 連線管理TCP
- tcp的半連線攻擊和全連線攻擊--TCP DEFER ACCEPTTCP
- 網路學習筆記(一):TCP連線的建立與關閉筆記TCP
- TCP連線注意事項TCP
- 12、Swoole 中 TCP、UDP 和長連線、短連線TCPUDP
- 拔掉網線後, 原本的 TCP 連線還存在嗎?TCP
- Libevent應用 (五) 連線監聽器,接收tcp連線TCP
- laravel建立軟連線Laravel
- 06 建立MySQL連線MySql
- ElasticSearch連線池建立Elasticsearch
- Socket和TCP連線過程解析TCP
- Luat例項教程:tcp短連線TCP
- TCP 三次握手原理以及半連線和全連線TCP
- linux系統影響tcp連線數的因素LinuxTCP
- 限制單個IP併發TCP連線的方法TCP
- win10如何建立寬頻連線_windows10建立寬頻連線的方法Win10Windows
- 聊聊 TCP 長連線和心跳那些事TCP
- 單臺伺服器最大tcp連線伺服器TCP
- TCP連線狀態異常記錄TCP
- 教你如何使用tcpkill殺掉tcp連線TCP
- 統計TCP連線數和狀態TCP
- 虛擬機器之間能夠ping通,但是建立tcp連線時卻顯示Failed in connect to TCP server: No route to host虛擬機TCPAIServer
- 可靠的TCP連線為何是三次握手TCP
- ESP作為單連線中的TCP客戶端TCP客戶端
- 【JDBC】使用OracleDataSource建立連線池用於連線OracleJDBCOracle
- 什麼是Socket連線?它與TCP連線有什麼關係TCP
- 多圖詳解 TCP 連線管理,太全了!!!TCP
- [從0到1編寫伺服器]TCP連線建立與斷開狀態變化伺服器TCP
- SQLSERVER建立連線伺服器SQLServer伺服器
- centos無法建立ssl連線CentOS
- 4個實驗,徹底搞懂TCP連線的斷開TCP
- 簡單總結nodejs處理tcp連線的核心流程NodeJSTCP
- 通過驅動建立與MySQL的連線MySql