TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的串連服務,採用三向交握建立一個串連。
第一次握手:建立串連時,用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
完成三向交握,用戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念:
未串連隊列:在三向交握協議中,伺服器維護一個未串連隊列,該隊列為每個用戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的串連在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。
Backlog參數:表示未串連隊列的最大容納數目。
SYN-ACK 重傳次數 伺服器發送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該串連資訊從半串連隊列中刪除。注意,每次重傳等待的時間不一定相同。
半串連存活時間:是指半串連隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半串連存活時間為Timeout時間、SYN_RECV存活時間。
[1] * SYN:同步標誌
同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三向交握建立TCP串連時有效。它提示TCP已連線的服務端檢查序列編號,該序列編號為TCP串連初始端(一般是用戶端)的初始序列編號。在這裡,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP串連交換的資料中每一個位元組都經過序列編號。在TCP前序中的序列編號欄包括了TCP分段中第一個位元組的序列編號。
*ACK:確認標誌
確認編號(Acknowledgement Number)欄有效。大多數情況下該標誌位是置位的。TCP前序內的確認編號欄內包含的確認編號(w+1,Figure-1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有資料。
*RST:複位標誌
複位標誌有效。用於複位相應的TCP串連。
*URG:緊急標誌
緊急(The urgent pointer) 標誌有效。緊急標誌置位,
*PSH:推標誌
該標誌置位時,接收端不將該資料進行隊列處理,而是儘可能快將資料轉由應用處理。在處理 telnet 或 rlogin 等互動模式的串連時,該標誌總是置位的。
*FIN:結束標誌
帶有該標誌置位的資料包用來結束一個TCP回話,但對應連接埠仍處於開放狀態,準備接收後續資料。