TCP協議詳解
TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個使用TCP/IP協議的協議集合。他取代了OSI七層模型,成為事實上的應用于實際的模型。
TCP/IP協議與OSI協議的關系如下:
各層的作用如下:
TCP特性:
工作在傳輸層面向連接協議
全雙工協議
半關閉
錯誤檢查
將數據打包成段,排序
確認機制
數據恢復,重傳
流量控制,滑動窗口
擁塞控制,慢啟動和擁塞避免算法
補充:TCP是一種面向連接的,可靠的傳輸層協議;全雙工代表可以雙向連同;TCP協議建立在不可靠的網絡層IP協議之上,IP不能提供任何可靠性機制,TCP的可靠性完全由自己實現,TCP采用的最基本的可靠性技術是確認與超時重傳和流量控制;
TCP包頭:
下面是包頭內容的解釋:
源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個。
序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由于序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從0開始。
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送方:我希望你下次發送的數據的第一個字節數據的編號是這個確認號。
數據偏移:表示TCP報文段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠。該字段的單位是32位(即4個字節為計算單位),4位二進制最大表示15,所以數據偏移也就是TCP首部最大60字節。
URG:表示本報文段中發送的數據是否包含緊急數據。后面的緊急指針字段(urgent pointer)只有當URG=1時才有效。
ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段。
PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀取數據,為接收后續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀取,就會一直停留在TCP接收緩沖區中
PST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后重新建立連接?;蛘哒f明上次發送給主機的數據有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段。
SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段。
FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結束報文段。
窗口大小: 表示現在允許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量。
校驗和:提供額外的可靠性。
緊急指針:標記緊急數據在數據字段中的位置。
選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節。
常見選項:
最大報文段長度
窗口擴大
時間戳
TCP端口:
如果把IP地址比作一間房子,端口就是出入這間房子的門。真正的房子只有幾個門,但是一個IP地址的端口可以 有65535個之多。端口號號只有整數,從0到65535。
在這65535個端口之中:
0-1023:被永久的分配給固定的系統應用使用,如:
22/tcp(ssh), 80/tcp(http), 443/tcp(https)
1024-49151: 被用于用戶端口或注冊端口,但要求并不嚴格,分配給程序注冊為某應用使用
包括:1433/tcp(SqlServer),1521/tcp(oracle), 3306/tcp(mysql), 11211/tcp/udp(memcached)
49152-65535: 動態端口或私有端口,客戶端程序隨機使用的端口
客戶端用戶可用的端口號隨機范圍:
現在重點講一下,TCP的三次握手,四次揮手:
三次握手,指的是通過兩臺要相連的主機互相發送消息,來確認連接。他們的連接過程相當于:
甲方:我能連接你吧?
我聽到你的話了,你能連接我:乙方
甲方:好的,那我連接你了
這樣三次相互發消息之后,雙方就可以建立連接了。
圖解:
CLOSED: 沒有任何連接狀態
LISTEN: 偵聽狀態,等待來自遠方TCP端口的連接請求
SYN-SENT:在發送連接請求后,等待對方確認
SYN-RECEIVED:在收到和發送一個連接請求后,等待對方確認
ESTABLISHED:代表傳輸連接建立,雙方進入數據傳送狀態
四次揮手,代表正在建立連接的兩臺主機,由其中一臺先發出斷連消息,另外一臺確定。其過程包手4次收發。
圖解,當客戶機發出斷連消息,并發送FIN=1,seq=u的數據包,FIN意味著分手。服務器端收到消息后發送ACK=1,seq=v,ack=u+1,ACK表示確認收到了客戶機發的消息,同時發送FIN=1,ACK=1,seq=w,ack=u+1,表示確認分手。這時客戶機收到消息,再次向服務器發送ACK=1,seq=u+1,ack=w+1,向服務器表示我(指客戶機)收到了確認分手的消息,這個過程所用的時間是大約兩分鐘。
ESTABLISHED:代表傳輸連接建立,雙方進入數據傳送狀態
FIN-WAIT-1:主動關閉,主機已發送關閉連接請求,等待對方確認
FIN-WAIT-2:主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求
TIME-WAIT:完成雙向傳輸連接關閉,等待所有分組消失
CLOSE-WAIT:被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失
CLOSING:雙方同時嘗試關閉傳輸連接,等待對方確認
有限狀態機:
客戶端發送FIN給服務端時,自己進入了FIN_WAIT_1狀態,這時等待接收服務端的報文,該報文會有三種可能:
1.只有服務端的ACK。只收到服務器的ACK,客戶端會進入FIN_WAIT_2狀態,當收到FIN時,才會給服務器端發送一個確認收到的ACK,然后進入TIME_WAIT狀態。這個狀態會持續2MSL。
2.只有服務器端的FIN時,回應一個ACK給服務端,進入CLOSING狀態,然后接收到服務端的ACK時,進入TIME_WAIT狀態
3.同時收到服務端的ACK和FIN,直接進入TIME_WAIT狀態。
可以由下圖表示:
客戶端的典型狀態轉移:
客戶端通過connect系統調用主動與服務器建立連接connect系統調用首先給服務器發送一個同步報文段,使連接轉移到SYN_SENT狀態。此后connect系統調用可能因為如下兩個原因失敗返回:
1. 如果connect連接的目標端口不存在(未被任何進程監聽),或者該端口仍被牌TIME_WAIT狀態的連接所占用,則服務器將給客戶端發送一個復位報文段,connect調用失敗。
2. 如果目標端口存在,但connect在超時時間內未收到服務器的確認報文段,則connect調用失敗。
Connect調用失敗將使連接立即返回到初始的CLOSED狀態。如果客戶端成功收到服務器的同步報文段和確認,則connect調用成功返回,連接轉移至ESTABLISHED狀態
孤兒連接:導致產生孤兒連接的,是發送的一方長時間收不到接收方發送的消息,一直停留在一個狀態下。這容易消耗資源,所以系統定義兩個參數來防止過多的孤兒連接拖累系統:
/proc/sys/net/ipv4/tcp_max_orphans 指定內核能接管的孤兒連接數目
/proc/sys/net/ipv4/tcp_fin_timeout 指定孤兒連接在內核中生存的時間
TCP超時重傳:
當網絡出現異常狀況時,在發送信息的過程中容易出現超時或丟包的情況。TCP服務則注重解決這一問題。
TCP服務必須能夠重傳超時時間內未收到確認的TCP報文段。為此,TCP模塊為每個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被發送時啟動,如果超時時間內未收到接收方的應答,TCP模塊將重傳TCP報文段并重置定時器。至于下次重傳的超時時間如何選擇,以及最多執行多少次重傳,就是TCP的重傳策略
與TCP超時重傳相關的兩個內核參數:
/proc/sys/net/ipv4/tcp_retries1, 指定在底層IP接管之前TCP最少執行的重傳次數,默認值是3.
/proc/sys/net/ipv4/tcp_retries2, 指定連接放棄前TCP最多可以執行的重傳次數,默認值15(一般對應13~30min)
TCP端口號:
源端口(Sorce Port)在前,目標端口(Dest Port)在后。
原創文章,作者:xxcj,如若轉載,請注明出處:http://www.www58058.com/86043
路過看看!