程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java網絡編程之傳輸控制協議(一)

Java網絡編程之傳輸控制協議(一)

編輯:JAVA編程入門知識

  一、概述
  
  TCP提供的網絡通訊接口與用戶數據報協議(UDP)截然不同。TCP的特性使網絡編程很具魅力,而且它刪除了UDP的很多干擾部分(例如數據包的排序和丟失),簡化了網絡通訊。UDP關心的是數據包的傳輸,而TCP關注的是建立網絡連接,並在網絡連接中發送和接收字節流。  數據包可以通過網絡用多種方法發送,並且它們到達的時間可能不同。這有利於性能的提高和程序的健壯性,因為單個包的丟失不一定干擾其它包的傳輸。但是,這樣的系統使程序員必須作更多的工作,他們必須保證數據的送達(delivery)。TCP通過對發送和次序的保證消除了這些額外的工作,為客戶端和支持兩路(two-way)通訊的服務器之間提供了可靠的字節通訊流。它在兩台計算機之間建立了"虛擬連接",可以通過虛擬連接發送數據流。
  
  TCP使用更低層的(lower-level)的IP通訊協議在兩台計算機之間建立連接。這種連接提供了一個答應字節流發送和接收的接口,並且采用透明的方式把數據轉換為IP數據報。數據報(datagram)的問題之一是不能保證數據包到達目的地。TCP解決了這個問題,它提供了有保證的數據字節的送達。當然,網絡錯誤影響了送達也是可能的,但是TCP通過類似重新發送數據包解決了這種實現的問題,並且只在情況很嚴重(例如沒有到網絡主機的路由或連接丟失了)的時候才提醒程序員。
  
  
  
  
  
  兩台計算機之間的虛擬連接表現為套接字(socket)。套接字答應數據的發送和接收,但是UDP套接字和TCP套接字之間有本質的區別。首先TCP套接字連接到單個計算機,然而UDP套接字可以向多台計算機傳輸或接收數據;其次,UDP套接字只能發送和接收數據包,然而TCP答應通過字節流的數據傳輸(表現為輸入流(InputStream)和輸出流(OutputStream))。為了在網絡上傳輸,它們被轉換為數據包,不需要程序員干涉(如圖2所示)。
  
  圖2:TCP把數據流處理為協議的命令,但是為在網絡上傳輸把流轉換為IP數據報
  
  1、 UDP(用戶數據報協議)上的TCP的優點
  
  ⑴自動化地錯誤控制
  
  TCP流上的數據傳輸比通過UDP的信息包的傳輸更可靠。在TCP下層,通過虛擬連接發送的數據包括一個檢查機制以確保它們沒有被破壞(與UDP類似)。但是,TCP保證了數據的送達--在傳輸過程中丟失的數據包將被重新傳輸。
  
  你也許想知道這是如何實現的--實際上,IP和UDP不保證送達,當數據包丟失的時候它們也不會發出任何警告。在TCP使用數據包發送了某個數據集合的時候就會啟動一個計時器。在UDP中,我們使用 DatagramSocket.setSoTimeout為receive()操作啟動一個計時器。在TCP中,假如接收者發送一個肯定的應答就禁止計時器,但是假如在超時前還沒有收到肯定的應答,數據包就被重新傳輸。這意味著寫入某個TCP套接字的任何數據將到達另一方而不需要程序員的進一步干涉(除非發生大的事故造成整個網絡癱瘓)。錯誤控制的代碼都由TCP處理了。
  
  ⑵可靠性
  
  因為在TCP連接中有多方參與的兩台計算機之間發送的數據通過IP數據報傳輸,數據包到達的次序可能經常出現不同。這可能需要使用一個循環從TCP套接字讀取信息,因為字節流的次序可能被打亂並且頻繁碰到不可靠的問題。幸運的是,次序等問題已經被TCP處理好了--每一個數據包都包含一個用於排序的序列號。後發送、先到達的數據包將保持在一個隊列中,直到排好次序的數據可以使用為止。接著數據就可以通過套接字的接口傳遞到應用程序中。
  
  ⑶易於使用
  
  盡管把信息存儲為數據包的確沒有超越程序員的范圍,但這不會是計算機之間通訊的最高效率的途徑。還應該有另外一些的復雜性,你可以討論在某個底線之上設計和建立軟件,為程序員提供足夠的復雜性。典型情況下開發者歡迎軟件開發復雜性的降低,TCP就實現了這種功能。TCP答應程序員用一種完全不同的方式思考問題,而這種方式更加現代化。數據不是被處理為不連續的單元(數據報包),而是被處理為連續的流,就像目前讀者所熟悉的I/O流。TCP套接字延續了傳統的Unix編程,在Unix編程中通訊與文件輸入和輸出是一樣處理的。無論開發者寫入網絡套接字、通訊管道、數據結構、用戶控制台或文件的時候,這種機制都時相同的。當然它也同樣應用與讀取信息。這使得通過TCP套接字進行通訊比通過數據報包通訊更加簡單。
  
  2、使用端口在應用程序之間通訊
  
  很明顯,TCP與UDP之間差別巨大,但是在兩種協議之間也有一項重要的相似性。兩種都共享了通訊端口的概念,它可以區別各個應用程序。在相同的端口上可以運行多個服務和客戶端,而且希望不給它們分配端口號而挑選出某個應用程序是不可能的。當TCP套接字建立到某台計算機的連接的時候,它需要兩部分非常重要的信息才能連接到遠程客戶端--該計算機的IP地址和端口號。此外,本地的IP地址和端口號也將綁定到它上面,因此遠程計算機能夠識別是哪一個應用程序建立了連接(圖3所示)。總之,你不會希望你自己的電子郵件被在相同系統上運行軟件的其它用戶訪問。
  
  圖3:本地端口識別了其它程序建立的到某個應用程序的連接,
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved