IP協議和路由程序員
IP協議
IP協議定義了一種高效、不可靠和無鏈接的傳輸方式。因爲傳輸沒有獲得確認,因此是不可靠的。一個包可能丟失了,或看不見了,或是延時了,或是傳輸順序錯了。可是傳輸設備並不檢測這些狀況,也不通知通訊雙方。無鏈接由於每一個包的傳遞與別的包是相互獨立的。同一個機器上的包可能經過不一樣的路徑到達另外一臺機器,或在別的機器上時已經丟失。因爲傳輸設備都試圖以最快的速度傳輸,因此是最高效的。
IP協議定義了經過TCP/IP網絡傳輸的數據的格式,定義了數據進行傳遞的路由功能。網絡
IP數據包的格式以下:
由一個頭和數據部分組成。數據包的頭部分包含諸如目的地址和源地址,數據的類型等信息。路由
數據包頭格式:
數據包是由軟件處理的,它的內容和格式並非由硬件所限定。
好比,頭4位是一個VERS,表示的是使用的IP協議的版本號。它表示發送者、接收者和路由器對該數據的處理都要按所示的版本進行處理。如今的版本號是4。軟件經過版原本決定怎樣進行處理。
頭長度(HLEN)也是用4位來表示以32位爲計量單位的頭的長度。
TOTAL LENGTH表示這個數據包的長度(字節數)。從而包中的數據的長度就能夠經過上面兩個數據而計算出來了。
通常來講,數據部分就是一個物理的幀。對於以太網來說,就是將整個的一個以太網的幀數據做爲一個IP數據包的數據來傳輸的。
數據包的頭裏面還包含了一些其餘的信息,請參見有關資料的具體介紹。it
IP路由
在一個網絡上,鏈接兩種基本設備,主機和路由器。路由器一般鏈接幾個物理網絡。對一臺主機來說,要將一個數據包發往別的網絡,就須要知道這個數據包應該走什麼路徑,才能到達目的地。對於一臺路由器來說,將收到的數據包發往哪一個物理網絡。所以,不管主機仍是路由器,在發送數據包是都要作路由選擇。
數據發送有兩種方式:直接數據發送和間接數據發送。
直接數據發送一般是在同一個物理網絡裏進行的。當一個主機或路由器要將數據包發送到同一物理網絡上的主機上時,是採用這種方式的。首先判斷IP數據包中的目的地址中的網絡地址部分,若是是在同一個物理網絡上,則經過地址分析,將該IP目的地址轉換成物理地址,並將數據解開,和該地址合成一個物理傳輸幀,經過局域網將數據發出。
間接數據發送是在不一樣物理網絡裏進行的。當一個主機或路由器發現要發送的數據包不在同一個物理網絡上時,這臺設備就先在路由表中查找路由,將數據發往路由中指定的下一個路由器。這樣一直向外傳送數據,到最後,確定有一個路由器發現數據要發往同一個物理網絡,因而,再用直接數據發送方式,將數據發到目的主機上。
主機和路由器在決定數據怎樣發送的時候,都要去查找路由。通常,都將路由組成一個路由表存在機器中。路由表通常採用Next-Hop格式,即(N,R)對。N是目標地址的網絡地址,R是傳輸路徑中的下一個路由。一般這個路由和這臺機器在同一物理網絡裏。io
第五節 TCP協議原理
TCP傳輸原理
TCP協議在IP協議之上。與IP協議提供不可靠傳輸服務不一樣的是,TCP協議爲其上的應用層提供了一種可靠傳輸服務。這種服務的特色是:可靠、全雙工、流式和無結構傳輸。
它是怎樣實現可靠傳輸的呢?
TCP協議使用了一個叫積極確認和重發送(positive acknowledgement with retransmission)的技術來實現這一點的。
接收者在收到發送者發送的數據後,必須發送一個相應的確認(ACK)消息,表示它已經收到了數據。
發送者保存發送的數據的記錄,在發送下一個數據以前,等待這個數據的確認消息。在它發送這個數據的同時,還啓動了一個記時器。若是在必定時間以內,沒有接收到確認消息,就認爲是這個數據在傳送時丟失了,接着,就會從新發送這個數據。
這種方法還產生了一個問題,就是包的重複。若是網絡傳輸速度比較低,等到等待時間結束後,確認消息才返回到發送者,那麼,因爲發送者採用的發送方法,就會出現重複的數據了。解決的一個辦法是給每一個數據一個序列號,並須要發送者記住哪一個序列號的數據已經確認了。爲了防止因爲延時或重複確認,規定確認消息裏也要包含確認序列號。從而發送者就能知道哪一個包已經確認了。
TCP協議中還有一個重要的概念:滑動窗口。這一方法的使用,使得傳輸更加高效。
有前面的描述可見,發送者在發送完一個數據包以後,要等待確認。在它收到確認消息以前的這段時間是空閒的。若是網絡延時比較長,這個問題會至關明顯。
滑動窗口方法是在它收到確認消息之前,發送多個數據包。能夠想象成有一個窗口在一個序列上移動。軟件
若是一個包發送出去以後尚未確認,叫作未確認包。一般未確認的包的個數就是窗口的大小。
此窗口的大小爲8。發送者容許在接收到一個確認消息之前發送8個數據包。當發送者接到窗口中第一個包的確認消息時,它就將窗口下滑一個。
在接收端,也有一個滑動窗口接收和確認一個包。路由器
端口
使用TCP傳輸就是創建一個鏈接。在TCP傳輸中一個鏈接有兩個端點組成。其實,一個鏈接表明的是發送和接收兩端應用程序的之間的一個通訊。能夠把他們想象成創建了一個電路。一般一個鏈接用下面的公式表示:
(host,port)
host是主機,port是端口。TCP端口能被幾個應用程序共享。對於程序員來說,能夠這樣理解:一個應用程序能夠爲不一樣的鏈接提供服務。硬件
TCP格式
TCP傳輸的單位是段,在創建鏈接,傳送數據,確認消息和告之窗口大小時均要進行段的交換。
段的格式以下圖:程序
段的格式也分紅兩部分,頭和數據。
上面格式中的名稱已經足夠說明了他們的做用了。具體的含義請參見有關資料。
創建一個TCP鏈接
TCP協議使用一個三次握手來創建一個TCP鏈接的。
握手過程的第一個段的代碼位設置爲SYN,序列號爲x,表示開始一次握手。接收方收到這個段後,向發送者回發一個段。代碼位設置爲SYN和ACK,序列號設置爲y,確認序列號設置爲x+1。發送者在受到這個段後,知道就能夠進行TCP數據發送了,因而,它又向接收者發送一個ACK段,表示,雙方的鏈接已經創建。 在完成握手以後,就開始正式的數據傳輸了。 上面握手段中的序列號都是隨機產生的。