Java網路程式設計之傳輸控制協議

2021-05-24 10:47:22 字數 3192 閱讀 6513

一、概述

tcp使用更低層的(lower-level)的ip通訊協議在兩台計算機之間建立連線。這種連線提供了乙個允許位元組流傳送和接收的介面,並且採用 透明的方式把資料轉換為ip資料報。資料報(datagram)的問題之一是不能保證資料報到達目的地。tcp解決了這個問題,它提供了***的資料位元組 的送達。當然,網路錯誤影響了送達也是可能的,但是tcp通過類似重新傳送資料報解決了這種實現的問題,並且只在情況很嚴重(例如沒有到網路主機的路由或 連線丟失了)的時候才提醒程式設計師。

兩台計算機之間的虛擬連線表現為套接字(socket)。套接字允許資料的傳送和接收,但是udp套接字和tcp套接字之間有本質的區別。首先 tcp套接字連線到單個計算機,然而udp套接字可以向多台計算機傳輸或接收資料;其次,udp套接字只能傳送和接收資料報,然而tcp允許通過位元組流的 資料傳輸(表現為輸入流(inputstream)和輸出流(outputstream))。為了在網路上傳輸,它們被轉換為資料報,不需要程式設計師干涉。

1、 udp(使用者資料報協議)上的tcp的優點

⑴自動化地錯誤控制

tcp流上的資料傳輸比通過udp的資訊包的傳輸更可靠。在tcp下層,通過虛擬連線傳送的資料報括乙個檢查機制以確保它們沒有被破壞(與udp類似)。但是,tcp保證了資料的送達--在傳輸過程中丟失的資料報將被重新傳輸。

你也許想知道這是如何實現的--實際上,ip和udp不保證送達,當資料報丟失的時候它們也不會發出任何警告。在tcp使用資料報傳送了某個資料集 合的時候就會啟動乙個計時器。在udp中,我們使用 datagramsocket.setsotimeout為receive()操作啟動乙個計時器。在tcp中,如果接收者傳送乙個肯定的應答就禁止計時 器,但是如果在超時前還沒有收到肯定的應答,資料報就被重新傳輸。這意味著寫入某個tcp套接字的任何資料將到達另一方而不需要程式設計師的進一步干涉(除非 發生大的事故造成整個網路癱瘓)。錯誤控制的**都由tcp處理了。

⑵可靠性

因為在tcp連線中有多方參與的兩台計算機之間傳送的資料通過ip資料報傳輸,資料報到達的次序可能經常出現不同。這可能需要使用乙個迴圈從tcp 套接字讀取資訊,因為位元組流的次序可能被打亂並且頻繁遇到不可靠的問題。幸運的是,次序等問題已經被tcp處理好了--每乙個資料報都包含乙個用於排序的 序列號。後傳送、先到達的資料報將保持在乙個佇列中,直到排好次序的資料可以使用為止。接著資料就可以通過套接字的介面傳遞到應用程式中。

⑶易於使用

2、使用埠在應用程式之間通訊

很明顯,tcp與udp之間差別巨大,但是在兩種協議之間也有一項重要的相似性。兩種都共享了通訊埠的概念,它可以區別各個應用程式。在相同的端 口上可以執行多個服務和客戶端,而且希望不給它們分配埠號而挑選出某個應用程式是不可能的。當tcp套接字建立到某台計算機的連線的時候,它需要兩部分 非常重要的資訊才能連線到遠端客戶端--該計算機的ip位址和埠號。此外,本地的ip位址和埠號也將繫結到它上面,因此遠端計算機能夠識別是哪乙個應 用程式建立了連線。總之,你不會希望你自己的電子郵件被在相同系統上執行軟體的其它使用者訪問。

本地埠識別了其它程式建立的到某個應用程式的連線,

允許多個tcp應用程式在同一臺計算機上執行

tcp中的埠與udp中的埠相似--它們的數字範圍都是1-65535。1024以下的埠是受限制的,只能被知名的服務(例如http、ftp、smtp、pop3和telnet)使用。表1列舉了一些知名的服務以及與它們對應的埠。

知名的服務 服務埠

telnet 23

smtp(簡單郵件傳輸協議) 25

http(超文字傳輸協議) 80

pop 3 110

3、套接字操作

tcp套接字可以執行多種操作,包括:

建立到某個遠端主機的連線。

給遠端主機傳送資料。

從遠端主機接收資料。

關閉連線。

此外還有一些特殊型別的套接字,它們提供繫結到特定埠號的服務。這類套接字通常用在伺服器中,可以執行下面一些操作:

繫結到某個本地埠

從遠端主機接收輸入的連線

從本地埠取消繫結。

這兩種套接字可以被分為不同的類,要麼是客戶端使用的,要麼是伺服器使用的(由於某些客戶端可以象伺服器一樣操作,還有些伺服器可以象客戶端一樣操作)。但是,客戶端和伺服器的角色還是可以靠經驗區分的。

二、tcp和客戶端/伺服器范型

1、 客戶端/伺服器范型

客戶端/伺服器范型把軟體分為兩類--客戶端程式和伺服器程式。客戶端軟體啟動乙個連線並傳送請求,而伺服器軟體監聽連線並處理請求。在udp程式設計 環境中,沒有建立實際的連線,並且udp應用程式可以在相同的套接字上建立並接收請求。在tcp環境中,兩台計算機之間建立了連線,客戶端/伺服器范型是 相對應的。

當軟體作為客戶端或者伺服器的時候,它嚴格地定義了角色以更容易適應我們所熟悉的思維模型。軟體要麼啟動請求,要麼處理請求。在兩種角色之間切換使 系統更加複雜。即使允許切換,在某個特定的時刻軟體程式也只能是客戶端,而另乙個必須是伺服器。如果兩個同時是客戶端,就沒有伺服器處理請求了。

客戶端/伺服器范型是乙個重要的理論概念,它廣泛用於實際應用程式中。目前也有其它的通訊模型,例如對等(peer to peer)模型,在這種模型中每一方都可以啟動通訊。但是客戶端/伺服器概念是更加流行的選擇,因為它很簡單並且在多數網路程式設計中使用。

2、網路客戶端

網路客戶端啟動連線,通常處理網路事務。伺服器程式用於實現客戶端的請求--客戶端不用實現伺服器的請求。儘管客戶端處於控制地位,但是伺服器端仍然有一些功能。客戶端可以要求伺服器刪除本地檔案系統的所有檔案,但是伺服器並不是必須執行這個任務的。

3、網路伺服器

網路伺服器的角色是繫結某個特定的埠(客戶端使用它定位伺服器),並且監聽新的連線。儘管客戶端是臨時的,並且只有在使用者選中的時候才執行,但是 伺服器程式必須不間斷地執行(即使實際上沒有已連線的客戶端),期望某個客戶端在某個時刻需要該服務。伺服器程式通常作為資料自適應監視器程序引用,使用 unix用法。它持久的執行,而且一般在該伺服器程式的主機啟動時啟動。因此伺服器一直等待,直到某個客戶端建立到該伺服器端口的連線。有些伺服器程式在 某個時刻只能處理單個連線,其它一些伺服器程式可以通過使用多執行緒同時處理多個連線。

當開始連線後,伺服器就服從客戶端。它等待客戶端傳送請求,並且「忠實地」處理它們(可是伺服器可以響應錯誤資訊,特別是當請求違反某些重要地協議 規則或有安全風險的時候)。某些協議(例如http/1.0)通常在每個連線中只允許乙個請求,而其它一些協議(例如pop3)支援一系列請求。伺服器可 以通過傳送響應或錯誤訊息應答客戶端的請求。學習新的網路協議(編寫客戶端或伺服器)與學習一種新的語言相似,只是語法改變了。但是典型情況下,它的命令 的數量更小,

網路原理 TCP協議(傳輸控制協議)

寫在前面 這篇文章講解的很詳細,但是建議從末尾的tcp的功能總結來看,先對tcp有乙個大致了解,在詳細的構建tcp的整體 定義 對資料傳輸進行控制的可靠協議,同時既要保證可靠性,又要具有高效性。特點 保證可靠性 校驗和 同時對資料體也進行校驗 序列號 按序到達 確認應答 每次傳送的訊息需要進行應答 ...

網路程式設計之UDP協議

將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...

網路程式設計之各種協議

在網路程式設計 時有各種協議,多的眼花繚亂,學著也容易混淆,特意整理一下,方便查閱 arp 位址解析協議,就是把ip位址和mac位址對應起來的,當網路中乙個ip位址沒有與之相對應的mac位址時,arp可以在網路中找到與之相對應的主機mac位址。ip在osi模型的網路層,mac在資料鏈路層,他倆彼此互...