TCP/IP協議

TCP/IP協議



    一、TCP/IP 來由       

        在世界上各地,各種各樣的電腦運行着各自不同的操作系統爲大家服務,這些電腦在表達同一種信息的時候所使用的方法是千差萬別。計算機使用者意識到,計算機只是單兵作戰並不會發揮太大的作用。只有把它們聯合起來,電腦纔會發揮出它最大的潛力。於是人們就想方設法的用電線把電腦連接到了一起。

        但是簡單的連到一起是遠遠不夠的,就好像語言不同的兩個人互相見了面,完全不能交流信息。因而他們需要定義一些共通的東西來進行交流,TCP/IP就是爲此而生。



    二、TCP/IP 定義

        TCP/IP(Transmission Control Protocol/Internet Protocol)是傳輸控制協議和網絡協議的簡稱,它定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。

        TCP/IP 不是一個協議,而是一個協議族的統稱,裏面包括了 IP 協議、ICMP 協議、TCP 協議、以及 http、ftp、pop3、https 協議等。網絡中的計算機都採用這套協議族進行互聯。



    三、TCP/IP模型框架

4.PNG


        (1)應用層:應用程序通過這一層訪問網絡,常見 FTP、HTTP、DNS 和 TELNET 協議;

        (2)傳輸層:TCP 協議和 UDP 協議;

        (3)網絡層:IP 協議,ARP、RARP 協議,ICMP 協議等;

        (4)網絡接口層:是 TCP/IP 協議的基層,負責數據幀的發送和接收



    四、TCP/IP數據報文

5.PNG

            源端口(Source Port):16bit, 表示報文發送方的端口號

            目的端口(Destination port): 16bit,表示報文接收方的端口號

            數據序號(seq),32位,TCP爲發送的每一個字節都編一個號碼,這裏存儲當前數據包數據第一個字節的序號。

            確認序號(ack),32位,爲了安全,TCP告訴接受者希望他下次接到數據包的第一個字節的序號。

            URG(Urgent):表示緊急(The urgent pointer) 指針是否有效。

            ACK(Acknowledgment):1表示這是一個確認的TCP包, 0則不是確認包。

            PSH(Push):該標誌置位時,一般是表示發送端緩存中已經沒有待發送的數據,接收端不將該數據進行隊列處理,而是儘可能快將數據轉由應用處理。

            RST(Reset):用於復位相應的TCP連接。通常在發生異常或者錯誤的時候會觸發復位TCP連接。

            SYN(Synchronize):表示同步序列編號(Synchronize Sequence Numbers)是否有效。該標誌僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號爲TCP連接發起端(一般是客戶端)的初始序列編號。在這裏,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個字節都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號。

            FIN(Finish):帶有該標誌置位的數據包用來結束一個TCP會話,但對應端口仍處於開放狀態,準備接收後續數據。當FIN標誌有效的時候我們稱呼這個包爲FIN包。



    五、TCP/IP的建立連接協議(三次握手)

6.PNG

        

        1)第一次握手:客戶將標誌位SYN置爲1,隨機產生一個值seq=x,並將該數據包發送給服務器,客戶進入SYN_SENT狀態,等待服務器確認。
        2)第二次握手:服務器收到數據包後由標誌位SYN=1知道Client請求建立連接,服務器將標誌位SYN和ACK都置爲1,ack=x+1,隨機產生一個值seq=y,並將該數據包發送給Client以確認連接請求,服務器進入SYN_RCVD狀態。
        3)第三次握手:客戶收到確認後,檢查ack是否爲x+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=y+1,並將該數據包發送給服務器服務器檢查ack是否爲y+1,ACK是否爲1,如果正確則連接建立成功,客戶服務器進入ESTABLISHED狀態,完成三次握手,隨後客戶服務器之間可以開始傳輸數據。



  六、TCP/IP的終止連接協議(四次揮手)

7.PNG


        由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉。

    (1)第一次揮手:客戶發送一個FIN,用來關閉客戶到服務器的數據傳送,客戶進入FIN_WAIT_1狀態。
    (2)第二次揮手:服務器收到FIN後,發送一個ACK給客戶,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),服務器進入CLOSE_WAIT狀態。
    (3)第三次揮手:服務器發送一個FIN,用來關閉服務器到Client的數據傳送,服務器進入LAST_ACK狀態。

    (4)第四次揮手:客戶收到FIN後,客戶進入TIME_WAIT狀態,接着發送一個ACK給服務器,確認序號爲收到序號+1,服務器進入CLOSED狀態,完成四次揮手。

        上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖:

8.PNG

    (1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

    (2)第二次揮手:Server也發送一個FIN用來關閉ServerClient的數據傳送,Server進入FIN_WAIT_1狀態

    (3)第三次揮手:Client發送一個ACK給Server,ack=J+1,Client進入CLOSING狀態,並且Server收到後進入TIME_WAIT狀態

    (4)第四次揮手:Server也發送一個ACK給Client,ack=J+1,Server進入CLOSING狀態,並且Client收到後進入TIME_WAIT狀態。


 

    兩臺主機網絡掩碼不一致可能導致ping不通的問題

        假設PCB 172.18.0.6的掩碼是255.255.0.0,PCA172.18.5.7的掩碼是255.255.255.0,他倆爲啥ping不通,當172.28.0.6給172.18.5.7發數據包的時候,172.18.0.6是按照255.255.0.0來判斷172.18.5.7和自己是不是一個網段。可就是ping不同

        ping操作其實是一次雙向通信過程

        其次,ping操作的實際內涵是什麼?看下面的步驟:

            (1)由本機構造一個ICMP請求包,發送給目的主機;

            (2)目的主機處理後構造一個ICMP響應包,返回給本機;

            (3)本機根據是否收到響應包,以及響應包的內容得到本次ping的結果,並交由顯示器呈現給用戶。

        也就是說,一次成功的ping操作其實是一次完整的雙向通信過程,並非只要本機能將請求發送出去就算好了的。數據包要能出得去,更要回得來。

        分析一下錯誤過程:

        1.當PCB構造好ICMP請求包打算髮送給PCB時,其處理過程應當如下:

        PCB首先將PCA的IP地址172.18.5.7與自己的掩碼255.255.0.0做與運算,得到它所認爲的PCA的網絡號:id=172.18.0.0

        然後用這個newid與自己的網絡號id=172.18.0.0 作比較,發現一樣;

        PCB把構造好的ICMP請求包直接交付給PCA 。

        PCA處理後構造完成ICMP響應包,打算回給PCB,其處理過程和前文PCA向PCB發送請求包一致,結果是PCA發送響應包失敗。
       呈現給你的直觀現象就是 PCB ping PCA 不通,系統給出的響應應該是請求超時,原因在於響應回不來。

        2.當PCA構造好ICMP請求包打算髮送給PCB時,其處理過程應當如下:

        PCA首先將PCB的IP地址172.18.0.6與自己的掩碼255.255.255.0做與運算,得到它所認爲的PCB的網絡號:id=172.18.1.0,然後用這個newid與自己的網絡號id=172.18.0.0 作比較,發現不一樣;

        PCA把構造好的ICMP請求包交付給網關,但網關不存在,於是請求發送失敗。

       呈現給你的直觀現象就是 PCA ping PCB 不通,系統給出的響應應該是:目標主機不可達,原因在於請求出不去。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章