面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文的邊界。這也就是說,應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。
面向位元組流的話,雖然應用程式和tcp的互動是一次乙個資料塊(大小不等),但tcp把應用程式看成是一連串的無結構的位元組流。tcp有乙個緩衝,當應用程式傳送的資料塊太長,tcp就可以把它劃分短一些再傳送。如果應用程式一次只傳送乙個位元組,tcp也可以等待積累有足夠多的位元組後再構成報文段傳送出去。
下圖是tcp和udp協議的一些應用。
下圖是tcp和udp協議的比較。
這裡再詳細說一下面向連線和面向無連線的區別:
從程式實現的角度來看,可以用下圖來進行描述。
從上圖也能清晰的看出,tcp通訊需要伺服器端偵聽listen、接收客戶端連線請求accept,等待客戶端connect建立連線後才能進行資料報的收發(recv/send)工作。而udp則伺服器和客戶端的概念不明顯,伺服器端即接收端需要繫結埠,等待客戶端的資料的到來。後續便可以進行資料的收發(recvfrom/sendto)工作。
在前面講解udp時,提到了udp保留了報文的邊界,下面我們來談談tcp和udp中報文的邊界問題。在預設的阻塞模式下,tcp無邊界,udp有邊界。
tcp無邊界,造成對採用tcp協議傳送的資料進行接收比較麻煩,在接收的時候易出現粘包,即傳送方傳送的若干包資料到接收方接收時粘成一包。由於tcp是流協議,對於乙個socket的包,如傳送 10aaaaabbbbb兩次,由於網路原因第一次又分成兩次傳送, 10aaaaab和bbbb,如果接包的時候先讀取10(包長度)再讀入後續資料,當接收得快,傳送的慢時,就會出現先接收了 10aaaaab,會解釋錯誤 ,再接到bbbb10aaaaabbbbb,也解釋錯誤的情況。這就是tcp的粘包。
在網路傳輸應用中,通常需要在網路協議之上再自定義乙個協議封裝一下,簡單做法就是在要傳送的資料前面再加乙個自定義的包頭,包頭中可以包含資料長度和其它一些資訊,接收的時候先收包頭,再根據包頭中描述的資料長度來接收後面的資料。詳細做法是:先接收包頭,在包頭裡指定包體長度來接收。設定包頭包尾的檢查位( 比如以0xaa開頭,0xcc結束來檢查乙個包是否完整)。對於tcp來說:
為了避免粘包現象,可採取以下幾種措施。
一、對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;
二、對於接收方引起的粘包,則可通過優化程式設計、精簡接收程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而盡量避免出現粘包現象;
三、由接收方控制,將一包資料按結構字段,人為控制分多次接收,然後合併,通過這種手段來避免粘包。
面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文的邊界。這也就是說,應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。
面向位元組流的話,雖然應用程式和tcp的互動是一次乙個資料塊(大小不等),但tcp把應用程式看成是一連串的無結構的位元組流。tcp有乙個緩衝,當應用程式傳送的資料塊太長,tcp就可以把它劃分短一些再傳送。如果應用程式一次只傳送乙個位元組,tcp也可以等待積累有足夠多的位元組後再構成報文段傳送出去。
下圖是tcp和udp協議的一些應用。
下圖是tcp和udp協議的比較。
這裡再詳細說一下面向連線和面向無連線的區別:
從程式實現的角度來看,可以用下圖來進行描述。
從上圖也能清晰的看出,tcp通訊需要伺服器端偵聽listen、接收客戶端連線請求accept,等待客戶端connect建立連線後才能進行資料報的收發(recv/send)工作。而udp則伺服器和客戶端的概念不明顯,伺服器端即接收端需要繫結埠,等待客戶端的資料的到來。後續便可以進行資料的收發(recvfrom/sendto)工作。
在前面講解udp時,提到了udp保留了報文的邊界,下面我們來談談tcp和udp中報文的邊界問題。在預設的阻塞模式下,tcp無邊界,udp有邊界。
tcp無邊界,造成對採用tcp協議傳送的資料進行接收比較麻煩,在接收的時候易出現粘包,即傳送方傳送的若干包資料到接收方接收時粘成一包。由於tcp是流協議,對於乙個socket的包,如傳送 10aaaaabbbbb兩次,由於網路原因第一次又分成兩次傳送, 10aaaaab和bbbb,如果接包的時候先讀取10(包長度)再讀入後續資料,當接收得快,傳送的慢時,就會出現先接收了 10aaaaab,會解釋錯誤 ,再接到bbbb10aaaaabbbbb,也解釋錯誤的情況。這就是tcp的粘包。
在網路傳輸應用中,通常需要在網路協議之上再自定義乙個協議封裝一下,簡單做法就是在要傳送的資料前面再加乙個自定義的包頭,包頭中可以包含資料長度和其它一些資訊,接收的時候先收包頭,再根據包頭中描述的資料長度來接收後面的資料。詳細做法是:先接收包頭,在包頭裡指定包體長度來接收。設定包頭包尾的檢查位( 比如以0xaa開頭,0xcc結束來檢查乙個包是否完整)。對於tcp來說:
為了避免粘包現象,可採取以下幾種措施。
一、對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;
二、對於接收方引起的粘包,則可通過優化程式設計、精簡接收程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而盡量避免出現粘包現象;
三、由接收方控制,將一包資料按結構字段,人為控制分多次接收,然後合併,通過這種手段來避免粘包。
TCP和UDP的區別
tcp transimission control protocol 傳輸控制協議 和udp user datagram protocol 是傳輸層的兩種實現版本!它們之間提供基本的服務又各有所長。因此,根據對特定服務質量的要求,應用層軟體單元可以選擇通過傳輸層的tcp版本或者udp版本來傳輸資料。...
TCP和UDP的區別
tcp和udp都是傳輸層的協議,他們的區別主要如下 1 tcp,全名 傳輸控制協議 是面向連線的,也就是說在傳送方和接收方在傳送資料之前,必須通過三次握手建立連線,相當於現實生活中的打 功能,必須先撥號,接通後才能說話,udp,全名 使用者資料報協議 是無連線的,其中一方向向另一方傳送資料時不需要建...
TCP和UDP的區別
tcp transmission control protocol,傳輸控制協議 是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。乙個tcp連線必須要經過三次 對話 才能建立起來,其中的過程非常複雜,我們這裡只做簡單 形象的介紹,你只要做到能夠理解這個過程即可。我們來看看這三...