1. 程式人生 > >TCP/IP協議詳解

TCP/IP協議詳解

分片 現在 子網 相同 lis 端口 拒絕 mes 客戶端程序

TCP/IP協議


Transmission Control Protocol /Internet Protocol   傳輸控制協議/英特爾互聯協議
TCP/IP是一個Protocol Stack,包括TCP、 IP、UDP、ICMP、RIP、TELNET、FTP、 SMTP、ARP等許多協議
最早發源於美國國防部(縮寫DOD)的英特爾的前身ARPA網項目1983年1月1日,TCP/IP取代了舊的網絡控制協議NCP,成為今天的互聯網和局域網的基石和標準,由互聯網工程任務組負責維護
共定義了四層
和ISO參考模型的分層有對應關系  

TCP/IP 協議和OSI模型 

TCP/IP              OSI參考模型

應用層               應用層
                         表示層
                         會話層

傳輸層               傳輸層

internet層           網絡層

數據鏈路層           數據鏈路層

物理層               物理層  

TCP特性


工作在傳輸層
面向連接協議
全雙工協議
半關閉
錯誤檢查
將數據打包成端,排序
確認機制
數據恢復重傳
流量控制,滑動窗口
擁塞控制,慢啟動和擁塞避免算法

TCP


源端口,目標端口:計算機上的進程要是和其他進程通信是通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過制定源端口和目標端口,就可以知道是那兩個進程需要通信,源端口,目標端口是用16位表示的,可推算計算機端口個數為2^16個
序列號:表示本報文段所發送數據的第一個字節的編號,在TCP鏈接中所傳送的字節節流的每一個字節都會按順序編號,由於序列號有32位表示,所以每2^32個字節,都會出現序列號回繞,再次從0開始
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號,也就是告訴發送發:我希望你下一次發送的數據的第一個字節數據的編號是這個確認號 
數據偏移: 表示TCP報文段的首部長度,共4位 由於TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文的長度到底有多長,他指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠 ,該字段單位是32位,4位二進最大表示15 所以數據飄逸也是TCP首部最大60字節  

TCP包頭


   URG:表示本報文段中發送的數據是否包含緊急數據。後面的緊急指針字段(urgent pointer)只有當URG=1時才有效 
    ACK:表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段才有效。 TCP規定,連接建立後,ACK必須為1,帶ACK標誌的TCP報文段稱為確認報文段 
    PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收後續數據騰出空 間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序 不將接收到的數據讀走,就會一直停留在TCP接收緩沖區中 
    RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必 須釋放連接,然後再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應, 帶RST標誌的TCP報文段稱為復位報文段 
    SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連 接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求 建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標誌的TCP報文 段稱為同步報文段 
    FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方: “我的數據已經發送完畢,你可以釋放連接了”,帶FIN標誌的TCP報文段稱為結束報文段

序號和確認號和標記為


seq:序號:發送者的發的包的序號 
ack:確認號:是接收者收到後返回的確認包 

標記位:
URG:(緊急指針位)只有當URG=1時才有意義
ACK:(確認位)表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段才有效。
RST:重置位
SYN:同步位
FIN:結束位

TCP包頭


窗口大小:表示現在允許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量
校驗和:提供額外的可靠性
緊急指針:標記緊急數據在數據字段中的位置
選項部分:其最大長度可根據TCP首部長度進行推算
常見選項:
    最大報文段長度:Maxium Segment Size,MSS
    窗口擴大:Windows Scaling
    時間戳: Timestamps  

TCP三次握手


所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。
三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息.在socket編程中,客戶端執行connect()時。將觸發三次握手:

三次握手過程


第一次握手:建立連接時,客戶端發送SYN包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認; 
第二次握手:服務器收到SYN包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態; 
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手.

TCP四次揮手

TCP的連接的拆除需要發送四個包,因此稱為四次揮手(four-way handshake)。
客戶端或服務器均可主動發起揮手動作,在socket編程中,任何一方執行close()操作即可產生揮手操作。

四次揮手過程


step1:第一次揮手
首先,客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,然後等待服務器的確認。其中終止標誌位FIN=1,序列號seq=u。

step2:第二次揮手
服務器收到這個FIN,它發送一個ACK,確認ack為收到的序號加一。

step3:第三次揮手
關閉服務器到客戶端的連接,發送一個FIN給客戶端。

step4:第四次揮手
客戶端收到FIN後,並發回一個ACK報文確認,並將確認序號seq設置為收到序號加一。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

客戶端發送FIN後,進入終止等待狀態,服務器收到客戶端連接釋放報文段後,就立即給客戶端發送確認,服務器就進入CLOSE_WAIT狀態,
此時TCP服務器進程就通知高層應用進程,因而從客戶端到服務器的連接就釋放了。
此時是“半關閉狀態”,即客戶端不可以發送給服務器,服務器可以發送給客戶端。 
此時,如果服務器沒有數據報發送給客戶端,其應用程序就通知TCP釋放連接,然後發送給客戶端連接釋放數據報,並等待確認。
客戶端發送確認後,進入TIME_WAIT狀態,但是此時TCP連接還沒有釋放,然後經過等待計時器設置的2MSL後,才進入到CLOSE狀態。

為什麽建立連接協議是三次握手,而關閉連接卻是四次呢


這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的連接請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。

但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;
但未必你所有的數據都全部發送給對方了,所以你可能未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,
所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。 

為什麽不能用兩次握手進行連接


我們知道,3次握手完成兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被發送和確認。

現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。
作為例子,考慮計算機S和C之間的通信,假定C給S發送一個連接請求分組,S收到了這個分組,並發 送了確認應答分組。
按照兩次握手的協定,S認為連接已經成功地建立了,可以開始發送數據分組。
可是,C在S的應答分組在傳輸中被丟失的情況下,將不知道S 是否已準備好,不知道S建立什麽樣的序列號,C甚至懷疑S是否收到自己的連接請求分組。
在這種情況下,C認為連接還未建立成功,將忽略S發來的任何數據分 組,只等待連接確認應答分組。
而S在發出的分組超時後,重復發送同樣的分組。這樣就形成了死鎖。  

為什麽TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?


雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。
所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

TCP超時重傳


異常網絡狀態下(開始出現超時或丟包),TCP控制數據傳輸以保證其承若的可靠服務
TCP服務必須能夠重傳超時時間內未收到的TCP報文段
為此,TCP模塊為每一個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被發送時啟動
與TCP超時重傳相關的兩個內核參數:
/proc/sys/net/ipv4/tcp_retries1:最少執行的重傳次數
proc/sys/net/ipv4/tcp_retries2:做多執行的重傳次數默認值15

TCP協議和UDP協議的區別是什麽


    TCP協議是有連接的,有連接的意思是開始傳輸實際數據之前TCP的客戶端和服務器端必須通過三次握手建立連接,會話結束之後也要結束連接。
    而UDP是無連接的  

    TCP協議保證數據按序發送,按序到達,提供超時重傳來保證可靠性,
    但是UDP不保證按序到達,甚至不保證到達,只是努力交付,即便是按序發送的序列,也不保證按序送到。

CP協議PORT


傳輸層通過port號,確認應用層協議
tcp :傳輸控制協議,面向連接協議:通信前需要建立虛擬鏈路:結束後拆除鏈路   0-65535
udp:無連接的協議  0-65535
IANA:互聯網數字分配機構(負責域名;數字資源;協議分配)
    0-1023:系統端口或特權端口(僅管理員可用)總所周知,永久的分配個固定 的系統應用使用  22(ssh)80(http) 443(https)
    1024-49125:     用戶端口或註冊端口但要求不嚴格
    49152-65535:動態端口或私有端口,客戶端程序隨機使用端口
    其範圍的定義:/proc/sys/net/ipv4/ip_local_port_range

Internet協議特征


運行與OSI網絡層
面向無連接的協議
獨立處理數據包
分層編址
盡力而為傳輸
無數據恢復功能 

單播多播廣播


     處地址類別外,還可以根據傳輸的信息特征將IP地址分為單播,多播,廣播。主機使用IP地址進行一對一(單播),一對多(多播),或一對所有(廣播)的通信
            單播:單播地址是IP網絡中最常見的。包含單播地址的分組發送給特定主機,
            多播:多播地址讓原設備能夠將元分組發送給一組設備
            廣播:廣播分組的目標IP地址的主機部分全為1 ,這以為著本地網絡(廣播域)中的所有主機都將接收並查看該分組

ARP地址解析協議:

IP PDU報頭


版本:占4位,指IP協議的版本目前的IP協議版本號為4
首部長度:占4位,可表示的最大數值是15個單位,一個單位為四個字節,因此IP的首部長度的最大數值是60個字節
區分服務:占8位用來獲得更好的服務,在舊標準中叫做服務類型,到實際上未被使用過,後改名為區分服務,只有在使用區分服務時,這個字段才起作用,一般的情況下都不使用
總長度:占16位,指首部和數據之和的長度,單位為字節,因此數據報的最大長度為65535字節,總長度不能超過最大傳輸單元MTU
標識:占16位它是一個計數器,通常,沒發送一個只有當報文,該值會加1 ,也用於數據包分片,自同一個包的若幹分片中,該值是相同的
標誌:占3位,目前只有後兩位有意義
DF:中間的一位,只有當DF=1是才允許分片。
MF:最高位,MF=1表示後面還有分片,表示最後一個分片
片偏移:占12位,指較長的分組 在分片後,該分片在原分組中的相對位置,片偏移以8個字節為偏移單位
生存時間:占8位,即為TTL數據報在網絡中可通過的路由器的最大值,TTL字段是有發送端初始設置一個8bit字節,推薦的初始值由分配數字RFC指定,當前值為64 發送ICMP回顯應答是=時經常把TTL設為最大值255
協議:占8位,指出此數據寶攜帶數據使用何種協議以便目的主機的IP層將數據部分上交給哪個處理過程,1表示ICMP協議,2表示為IGMP協議 ,6表示TCP協議,17表示為UDP協議
首部檢驗和:占16位,只驗證數據報的首部不檢驗數據部分,這裏不采用CRC檢驗碼而采用簡單的計算方法
原地址和目標地址:都各自占4個字節,分別記錄原地址和目的地址

IP地址


他們可唯一標識IP網絡中的每一臺設備
每臺主機(計算機,網絡設備,外圍設備)必須具有唯一的地址
IP地址有兩部分組成:
    標識網絡
    每個網絡分配一個ID
主機ID:
    標識單個主機
    有組織非配給各設備

IP地址分類


A類:
    0 000 0000 - 0111 1111:1-127 
    網絡數:126,127
    每個網絡中的主機數:2^24-2
    默認子網掩碼:255.0.0.0
    私網地址:10.0.0.0
B類:
    10 00 0000 - 10 11 1111: 128-191
    網絡數:2^14
    每個網絡中的主機數:2^16 -2
    默認子網掩碼:255.255.0.0
    私網地址:172.16.0.0-172.31.0.0
C類:
    110 0 0000 -110 1 1111:192-223
    網絡數:2^21
    每個網絡中的主機數:2^8-2
    默認子網掩碼:255,255,255.0
D類:組播
E類:240-255

TCP/IP協議詳解