成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

UDP協議與TCP協議的比較

網絡 網絡管理
UDP協議是無面向連接的、不可靠的、無序的、無流量控制的傳輸層協議,UDP發送的每個數據報是記錄型的數據報,所謂的記錄型數據報就是接收進程可以識別接收到的數據報的記錄邊界。

UDP協議是無面向連接的、不可靠的、無序的、無流量控制的傳輸層協議,UDP發送的每個數據報是記錄型的數據報,所謂的記錄型數據報就是接收進程可以識別接收到的數據報的記錄邊界。TCP協議是面向連接的、可靠的、有序的、擁有流量控制的傳輸層協議,它是字節流的協議,無記錄邊界。

1.記錄與字節流

UDP協議:發送進程在發送每個數據報的時候并不等待多個數據報集中在一起以一個較大數據報發送出去,而是立即發送出去,它是記錄型的協議。并且接收進程每次通過read或recv……獲得的數據報必定是發送進程所發送的那個數據報不可能是多個數據報,接收進程可以識別到發送進程所發送的每個數據報的記錄邊界。

TCP協議:發送進程在發送每個數據報的時候在內核處理過程中有可能并不立即發送出去,而是會將多個數據報集中在一起以一個較大的數據報來發送,它是字節流的協議。而接收進程每次通過read來讀取發送進程發送過來的數據報并不一定是發送進程原先發送數據報,接收進程無法識別每個數據報的記錄邊界,所以TCP協議就是字節流的、無記錄邊界的協議。

例如:QQ聊天所用到的協議就應該是有記錄邊界的,聊天過程中是以“消息”為單位,消息可以看成一個記錄,所以QQ聊天協議采取UDP協議而不是TCP協議。

2.有序與無序

UDP協議:發送進程所發送的每個數據報并不按照原先發送的順序到達接收進程,有可能早發送的數據報較后到達接收進程。因為數據報在經過中間路徑的傳送時會因為各個數據報傳送的路徑不同或者其它原因而造成這些數據報到達的順序不同,UDP協議是無序的傳輸協議。所以為了使基于UDP協議的應用程序有序,必須在應用程序中設置序號、確認機制來使其有序。

TCP協議:有序協議,有超時、序號、重傳、確認機制。

例如:FTP協議是用于傳送文件的協議,為了確保在傳送文件內容的時候,傳送的每個數據報協議有序接收,所以FTP協議是基于TCP協議。

那為什么TFTP協議是基于UDP協議?因為為了保證有序,TFTP協議中引入了確認、序號字段。

這里還有一個問題,FTP協議中的控制連接傳送的內容好像都是基于消息形式,客戶端在控制連接上發出一個請求消息,服務器端返回一個請求結果消息,感覺應該FTP控制連接采取UDP協議,為什么采取TCP協議?因為控制連接上是交互式的消息傳送,客戶端在發送一個請求之后,在服務器端的響應消息未到達之前,客戶端是不會發送第二個請求消息,所以不用擔心這兩個請求消息會疊加在一起。也就是對于交互式的消息傳遞也可以采用TCP協議。

3.流量控制

UDP協議:沒有流量控制機制,如果發送進程發送數據報塞滿了接收進程的接收緩沖區,就會丟棄數據報。出現這種情況,UDP協議不會通知發送進程減緩數據的發送速率。

TCP協議:擁有流量控制。

4.客戶端通信過程比較

4.1 客戶端的連接過程比較

UDP協議在創建插口之后,可以同多個服務器端建立通信,而TCP協議只能與一個服務器端建立通信,TCP不允許目的地址是廣播或多播地址,UDP允許。UDP協議客戶端同服務器端的通信關系可以是一對多的關系,而TCP協議只能是一對一的關系。

當然UDP協議也可以像TCP協議一樣,通過connect來指定對方的ip地址、端口(對應下圖1中的③操作),connect是插口連接操作,connect操作之后代表對應的插口已連接,與TCP協議不同,UDP的connect實現不包含三向握手。不管是UDP協議還是TCP協議,connect實現的共同部分都包括:若所指定插口的本地地址、端口未指定,那么connect的時候由內核為其指定本地地址、本地端口,內核根據插口中的目的地址來判斷外出接口,然后指定該外出接口的IP地址為插口的本地地址。UDP協議通過connect操作之后同服務器端的通信關系成為一對一關系,不再是一對多的關系,而且這時也不能指定目的地址為廣播或多播地址,因為connect函數不允許目的地址為廣播或多播地址。UDP協議經過 connect之后,在通過sendto來發送數據報時不需要指定目的地址、端口,如果指定了目的地址、端口,那么會返回錯誤。通過UDP協議可以給同一個插口指定多次connect操作,而TCP協議不可以,TCP只能指定一次connect操作。UDP協議指定第二次connect操作之后會先斷口第一次的連接,然后建立第二次的連接。

客戶端在建立同服務器端的連接過程中,第一步都會通過socket建立連接套接字,然后通過bind來綁定本地地址、本地端口,當然綁定操作可以不用指定。

UDP協議:若未指定綁定操作,那么可以通過下面connect操作來由內核負責插口的綁定操作,若connect又未指定,那么綁定操作只好通過插口的寫操作(sendto、sendmsg)來指定目的地址、端口,這時插口本地地址不會指定,為通配地址,而本地端口由內核指定,第一次sendto 操作之后,插口的本地端口經過內核指定之后就不會更改。

TCP協議:若未指定綁定操作,可以通過下面connect操作來由內核負責插口的綁定操作。內核會根據插口中的目的地址來判斷外出接口,然后指定該外出接口的IP地址為插口的本地地址。Connect操作對于TCP協議的客戶端是必不可少的,必須指定。

(不管是UDP協議還是TCP協議,所對應插口經過connect操作之后就是已連接的插口,未經過connect就代表未連接的插口。)

通過bind來綁定本地地址、本地端口的時候,不管是已連接的還是未連接的插口,如果存在某一個插口的本地端口同用戶所要綁定的本地端口相同,都會返回EADDRINUSE(Address already in use)錯誤。如果要綁定同已存在插口的本地端口相同的端口,必須先設置插口選項SO_REUSEADDR,然后再綁定。在linux系統中如果綁定的本地地址不同而本地端口相同可以不用設置插口選項SO_REUSEADDR,而對于其它的類UNIX系統根據《unix網絡編程》中所描述的都要預先設置 SO_REUSEADDR插口選項。

對于TCP協議絕不允許綁定的本地地址、端口同已存在的插口(不管是已連接的還是未連接的插口)相同。對于UDP協議通過設置插口選項 SO_REUSEPORT,允許綁定相同的本地地址、本地端口。在linux系統中,沒有SO_REUSEPORT這個選項,所以在linux系統中 UDP協議同TCP協議一樣都不允許存在兩個插口有相同的本地地址、本地端口。

TCP協議同UDP協議還有一個很大的不同點:例如有一臺多宿主機,它所擁有的IP地址有A、B、C,現在創建4個相同的TCP監聽端口port,對應的四個插口地址結構(*,port)、(A,port)、(B,port)、(C,port),現在有客戶端要同(A,port)建立連接,那么只會同(A,port)插口建立連接,而不會同擁有通配地址*的插口建立連接。而如果是創建4個相同的UDP監聽端口port,對應的四個插口地址結構(*,port)、(A,port)、(B,port)、(C,port),那么有客戶端要同(A,port)建立通信,那么發送到(A,port)的數據報也會拷貝一份到(*,port)插口。原因:TCP協議之間的通信是一對一的關系,而UDP可以是一對多的關系。

步驟

UDP協議

TCP協議

socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

bind捆綁本地地址、本地端口(可忽略,在下面connect中或第一次sendto由內核來指定)

bind捆綁本地地址、本地端口(可忽略,在下面的connect操作中由內核來指定本地地址、端口)

connect指定對方地址、端口,建立連接(可忽略由sendto指定對方地址、端口)

connect指定對方地址、端口,建立連接

讀或寫操作

讀或寫操作

圖1 客戶端連接過程

4.2 服務器端的連接過程比較

對于UDP協議客戶端與服務器端沒有什么本質的區別,每個UDP協議的客戶端也是服務器端。而TCP協議就不同了,TCP協議必須通過listen 來申請監聽,然后通過accept來接收一個客戶端的連接,當接收客戶端的連接會再創建一個單獨的插口用來同客戶端之間進行數據通信,也就是說服務器端由一個單獨的監聽插口負責監聽客戶端的連接請求,當接收到一個來自客戶端的連接請求之后,服務器會另外創建一個插口負責同客戶端之間進行連接通信。

服務端在通過bind來綁定本地地址、本地端口的時候應注意的情況,同客戶端是相同的。

步驟

UDP協議

TCP協議

socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

bind捆綁本地地址、本地端口(可忽略,在下面connect中或第一次sendto由內核來指定)

bind捆綁本地地址、本地端口(可忽略,在下面listen操作中由內核來指定本地地址、本地端口)

connect指定對方地址、端口,建立連接(可忽略由sendto指定對方地址、端口)

listen監聽客戶端的連接

讀或寫操作

accept接受客戶端的連接

 

讀或寫操作

圖2 服務器端連接過程

責任編輯:張存 來源: 博客
相關推薦

2014-12-03 14:05:01

TCPUDP

2010-07-07 10:45:22

TCP UDP協議

2010-07-07 11:02:26

TCP UDP協議服務

2013-05-27 10:48:16

TCPUDP傳輸協議

2010-07-06 15:50:12

TCP和UDP協議

2010-07-07 10:42:36

TCP UDP協議

2020-07-28 08:38:10

TCPUDP協議

2010-06-09 14:36:44

TCP與UDP協議

2010-07-12 15:40:24

2010-06-09 14:42:21

UDP協議TCP協議

2019-11-29 07:53:07

DNSTCP網絡協議

2010-07-07 10:52:05

TCP UDP協議

2014-06-13 13:47:31

UDP

2010-07-14 10:15:31

2010-07-06 15:16:34

UDP協議

2011-11-08 16:32:24

LinuxFreeBSDTCP

2010-07-06 16:43:18

UDP協議Java

2010-07-07 11:17:01

UDP協議應用

2010-07-01 16:55:03

UDP協議

2010-07-09 09:29:00

UDP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久亚洲欧洲 | 久干网 | 国产成人免费在线 | 亚洲国产精品视频一区 | 午夜国产| 日韩欧美国产不卡 | 亚洲国产成人精品女人 | 一区二区三区免费 | 91精品国产综合久久婷婷香蕉 | 精品国产色| 91在线电影 | 国产日韩一区二区 | 国产精品欧美一区喷水 | 亚洲精品久久久久久一区二区 | 日韩一区在线观看视频 | 久久精品一区二区三区四区 | 成人av播放| 日韩在线一区二区三区 | 国精产品一区一区三区免费完 | 人妖av| 精品国产乱码久久久久久果冻传媒 | 欧美激情精品久久久久久 | 欧美日韩精品一区二区天天拍 | 中文字幕日韩专区 | 麻豆毛片 | 亚洲精品一区在线观看 | 免费在线观看av网站 | 神马久久av | 久操国产 | 成人国产在线视频 | 爱爱小视频 | 日韩在线免费播放 | 久久国产精品亚洲 | 蜜桃av鲁一鲁一鲁一鲁 | 精品一区二区三区四区五区 | 自拍偷拍欧美 | 99re视频精品 | 欧美一区二区三区在线观看 | 国产精品永久在线观看 | 国产精品久久网 | 天天天插|