網路程式設計 TCP IP協議和UDP協議

2021-10-09 16:21:40 字數 4905 閱讀 9811

tcp是面向連線的通訊協議,通過三次握手建立連線,通訊完成時要拆除連線,由於tcp是面向連線的所以只能用於端到端的通訊。

tcp提供的是一種可靠的資料流服務,採用「帶重傳的肯定確認」技術來實現傳輸的可靠性。tcp還採用一種稱為「滑動視窗」的方式進行流量控制,所謂視窗實際表示接收能力,用以限制傳送方的傳送速度。

如果ip資料報中有已經封好的tcp資料報,那麼ip將把它們向『上』傳送到tcp層。tcp將包排序並進行錯誤檢查,同時實現虛電路間的連線。tcp資料報中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。

tcp將它的資訊送到更高層的應用程式,例如telnet的服務程式和客戶程式。應用程式輪流將資訊送回tcp層,tcp層便將它們向下傳送到ip層,裝置驅動程式和物理介質,最後到接收方。

面向連線的服務(例如telnet、ftp、rlogin、x windows和smtp)需要高度的可靠性,所以它們使用了tcp。dns在某些情況下使用tcp(傳送和接收網域名稱資料庫),但使用udp傳送有關單個主機的資訊。

udp是面向無連線的通訊協議,udp資料報括目的埠號和源埠號資訊,由於通訊不需要連線,所以可以實現廣播傳送。

udp通訊時不需要接收方確認,屬於不可靠的傳輸,可能會出現丟包現象,實際應用中要求程式設計師程式設計驗證。

常用qq,就是乙個以udp為主,tcp為輔的通訊協議。

無法簡單地、絕對地去做比較:tcp 用於在傳輸層有必要實現可靠傳輸的情況;而在一方面,udp 主要用於那些對高速傳輸和實時性有較高要求的通訊或廣播通訊。tcp 和 udp 應該根據應用的目的按需使用。

資料鏈路和 ip 中的位址,分別指的是 mac 位址和 ip 位址。前者用來識別同一鏈路中不同的計算機,後者用來識別 tcp/ip 網路中互連的主機和路由器。在傳輸層也有這種類似於位址的概念,那就是埠號。埠號用來識別同一臺計算機中進行通訊的不同應用程式。因此,它也被稱為程式位址。

一台計算機上同時可以執行多個程式。傳輸層協議正是利用這些埠號識別本機中正在進行通訊的應用程式,並準確地將資料傳輸。

埠號的確定

標準既定的埠號:這種方法也叫靜態方法。它是指每個應用程式都有其指定的埠號。但並不是說可以隨意使用任何乙個埠號。例如 http、ftp、telnet 等廣為使用的應用協議中所使用的埠號就是固定的。這些埠號被稱為知名埠號,分布在 0~1023 之間;除知名埠號之外,還有一些埠號被正式註冊,它們分布在 1024~49151 之間,不過這些埠號可用於任何通訊用途。

時序分配法:伺服器有必要確定監聽埠號,但是接受服務的客戶端沒必要確定埠號。在這種方法下,客戶端應用程式完全可以不用自己設定埠號,而全權交給作業系統進行分配。動態分配的埠號範圍在 49152~65535 之間。

tcp 提供面向有連線的通訊傳輸。面向有連線是指在資料通訊開始之前先做好兩端之間的準備工作。

所謂三次握手是指建立乙個 tcp 連線時需要客戶端和伺服器端總共傳送三個包以確認連線的建立。在socket程式設計中,這一過程由客戶端執行connect來觸發。

第一次握手:客戶端將標誌位syn置為1,隨機產生乙個值seq=j,並將該資料報傳送給伺服器端,客戶端進入syn_sent狀態,等待伺服器端確認。

第二次握手:伺服器端收到資料報後由標誌位syn=1知道客戶端請求建立連線,伺服器端將標誌位syn和ack都置為1,ack=j+1,隨機產生乙個值seq=k,並將該資料報傳送給客戶端以確認連線請求,伺服器端進入syn_rcvd狀態。

第三次握手:客戶端收到確認後,檢查ack是否為j+1,ack是否為1,如果正確則將標誌位ack置為1,ack=k+1,並將該資料報傳送給伺服器端,伺服器端檢查ack是否為k+1,ack是否為1,如果正確則連線建立成功,客戶端和伺服器端進入established狀態,完成三次握手,隨後客戶端與伺服器端之間可以開始傳輸資料了。

四次揮手即終止tcp連線,就是指斷開乙個tcp連線時,需要客戶端和服務端總共傳送4個包以確認連線的斷開。在socket程式設計中,這一過程由客戶端或服務端任一方執行close來觸發。

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

客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin=1,其序列號為seq=u(等於前面已經傳送過來的資料的最後乙個位元組的序號加1),此時,客戶端進入fin-wait-1(終止等待1)狀態。 tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。

伺服器收到連線釋放報文,發出確認報文,ack=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了close-wait(關閉等待)狀態。tcp伺服器通知高層的應用程序,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有資料要傳送了,但是伺服器若傳送資料,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個close-wait狀態持續的時間。

客戶端收到伺服器的確認請求後,此時,客戶端就進入fin-wait-2(終止等待2)狀態,等待伺服器傳送連線釋放報文(在這之前還需要接受伺服器傳送的最後的資料)。

伺服器將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文,fin=1,ack=u+1,由於在半關閉狀態,伺服器很可能又傳送了一些資料,假定此時的序列號為seq=w,此時,伺服器就進入了last-ack(最後確認)狀態,等待客戶端的確認。

客戶端收到伺服器的連線釋放報文後,必須發出確認,ack=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了time-wait(時間等待)狀態。注意此時tcp連線還沒有釋放,必須經過2∗∗msl(最長報文段壽命)的時間後,當客戶端撤銷相應的tcb後,才進入closed狀態。

伺服器只要收到了客戶端發出的確認,立即進入closed狀態。同樣,撤銷tcb後,就結束了這次的tcp連線。可以看到,伺服器結束tcp連線的時間要比客戶端早一些。

每個分層中,都會對所傳送的資料附加乙個首部,在這個首部中包含了該層必要的資訊,如傳送的目標位址以及協議相關資訊。通常,為協議提供的資訊為包首部,所要傳送的內容為資料。在下一層的角度看,從上一層收到的包全部都被認為是本層的資料。

網路中傳輸的資料報由兩部分組成:一部分是協議所要用到的首部,另一部分是上一層傳過來的資料。首部的結構由協議的具體規範詳細定義。在資料報的首部,明確標明了協議應該如何讀取資料。反過來說,看到首部,也就能夠了解該協議必要的資訊以及所要處理的資料。

首先應用程式會進行編碼處理,這些編碼相當於 osi 的表示層功能;

編碼轉化後,郵件不一定馬上被傳送出去,這種何時建立通訊連線何時傳送資料的管理功能,相當於 osi 的會話層功能。

tcp 根據應用的指示,負責建立連線、傳送資料以及斷開連線。tcp 提供將應用層發來的資料順利傳送至對端的可靠傳輸。為了實現這一功能,需要在應用層資料的前端附加乙個 tcp 首部。

ip 將 tcp 傳過來的 tcp 首部和 tcp 資料合起來當做自己的資料,並在 tcp 首部的前端加上自己的 ip 首部。ip 包生成後,參考路由控制表決定接受此 ip 包的路由或主機。

從 ip 傳過來的 ip 包對於乙太網來說就是資料。給這些資料附加上乙太網首部並進行傳送處理,生成的乙太網資料報將通過物理層傳輸給接收端。

主機收到乙太網包後,首先從乙太網包首部找到 mac 位址判斷是否為傳送給自己的包,若不是則丟棄資料。

如果是傳送給自己的包,則從乙太網包首部中的型別確定資料型別,再傳給相應的模組,如 ip、arp 等。這裡的例子則是 ip 。

ip 模組接收到 資料後也做類似的處理。從包首部中判斷此 ip 位址是否與自己的 ip 位址匹配,如果匹配則根據首部的協議型別將資料傳送給對應的模組,如 tcp、udp。這裡的例子則是 tcp。

另外嗎,對於有路由器的情況,接收端位址往往不是自己的位址,此時,需要借助路由控制表,在調查應該送往的主機或路由器之後再進行**資料。

在 tcp 模組中,首先會計算一下校驗和,判斷資料是否被破壞。然後檢查是否在按照序號接收資料。最後檢查埠號,確定具體的應用程式。資料被完整地接收以後,會傳給由埠號識別的應用程式。

接收端應用程式會直接接收傳送端傳送的資料。通過解析資料,展示相應的內容。

在 tcp 中,當傳送端的資料到達接收主機時,接收端主機會返回乙個已收到訊息的通知。這個訊息叫做確認應答(ack)。當傳送端將資料發出之後會等待對端的確認應答。如果有確認應答,說明資料已經成功到達對端。反之,則資料丟失的可能性很大。

在一定時間內沒有等待到確認應答,傳送端就可以認為資料已經丟失,並進行重發。由此,即使產生了丟包,仍然能夠保證資料能夠到達對端,實現可靠傳輸。

未收到確認應答並不意味著資料一定丟失。也有可能是資料對方已經收到,只是返回的確認應答在途中丟失。這種情況也會導致傳送端誤以為資料沒有到達目的地而重發資料。

此外,也有可能因為一些其他原因導致確認應答延遲到達,在源主機重發資料以後才到達的情況也屢見不鮮。此時,源主機只要按照機制重發資料即可。

對於目標主機來說,反覆收到相同的資料是不可取的。為了對上層應用提供可靠的傳輸,目標主機必須放棄重複的資料報。為此我們引入了序列號。

序列號是按照順序給傳送資料的每乙個位元組(8位位元組)都標上號碼的編號。接收端查詢接收資料 tcp 首部中的序列號和資料的長度,將自己下一步應該接收的序列號作為確認應答返送回去。通過序列號和確認應答號,tcp 能夠識別是否已經接收資料,又能夠判斷是否需要接收,從而實現可靠傳輸。

首先作為傳送端的客戶端在應用層(http 協議)發出乙個想看某個 web 頁面的 http 請求。

接著,為了傳輸方便,在傳輸層(tcp 協議)把從應用層處收到的資料(http 請求報文)進行分割,並在各個報文上打上標記序號及埠號後**給網路層。

在網路層(ip 協議),增加作為通訊目的地的 mac 位址後**給鏈路層。這樣一來,發往網路的通訊請求就準備齊全了。

接收端的伺服器在鏈路層接收到資料,按序往上層傳送,一直到應用層。當傳輸到應用層,才能算真正接收到由客戶端傳送過來的 http請求。

網路程式設計的OSI協議和TCP IP協議

在網路發展中,人們為了規範網際網路的資訊互動,就必須遵守一種約定,從而引出了osi和tcp ip的協議。首先講一下osi協議,它是一種開放系統的互聯模式。有七層結構分別為應用層 表示層 會話層 傳輸層 網路層 資料鏈路層和物理層。它們每一層都有各自的一些協議。但是在後來的規劃中發現osi的模式太複雜...

網路程式設計之UDP協議和TCP協議

udp協議和tcp協議 udp協議 使用者資料報協議 需要乙個傳送端和接收端 傳送端 只負責傳送資料,不管接收端是否接收到資料.在傳輸資料的過程中是允許資料報丟失的 特點 1.需要乙個傳送端和接收端 2.傳送端只負責傳送資料,不管接收端是否接收到資料 3.在傳輸資料的過程中是允許資料報丟失的 tcp...

UDP協議和併發程式設計

稱之為資料報協議。特點 1 不需要建立鏈結。2 不需要知道對方是否收到。3 資料不安全 4 傳輸速度快 5 能支援併發 6 不會粘包 7 無需先啟動服務端再啟動客戶端 優點 傳輸速度快 能支援併發 不會粘包 缺點 資料不安全,容易丟失 應用場景 早期的qq聊天室。tcp協議 稱為流式協議 優點 資料...