訂閱
糾錯
加入自媒體

在進行UDP編程的時候,一次發(fā)送多少bytes好?

2021-04-26 16:32
拓跋阿秀
關注

服務器:

fd:accept返回的連接描述字,每個連接有一個,生命周期為連接周期。

注:sockfd是監(jiān)聽描述字,一個服務器只有一個,用于監(jiān)聽是否有連接;fd是連接描述字,用于每個連接的操作。

fd:連接描述字。

buf:緩沖區(qū)buf。

count:緩沖區(qū)長度。

注:大于0表示讀取的字節(jié)數(shù),返回0表示文件讀取結束,小于0表示發(fā)生錯誤。

sockfd:服務器socket描述字。

addr:指向地址結構指針。

addrlen:協(xié)議地址長度。

注:一旦accept某個客戶機請求成功將返回一個全新的描述符用于標識具體客戶的TCP連接。

sockfd:要監(jiān)聽的sock描述字。

backlog:socket可以排隊的最大連接數(shù)。

sockfd:socket返回的套接字描述符,類似于文件描述符fd。

addr:有個sockaddr類型數(shù)據(jù)的指針,指向的是被綁定結構變量。

addrlen:地址長度。

domain:協(xié)議域,決定了socket的地址類型,IPv4為AF_INET。

type:指定socket類型,SOCK_STREAM為TCP連接。

protocol:指定協(xié)議。IPPROTO_TCP表示TCP協(xié)議,為0時自動選擇type默認協(xié)議。

創(chuàng)建socket -> int socket(int domain, int type, int protocol);

綁定socket和端口號 -> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

   // IPv4的sockaddr地址結構
   struct sockaddr_in {
       sa_family_t sin_family;    // 協(xié)議類型,AF_INET
       in_port_t sin_port;    // 端口號
       struct in_addr sin_addr;    // IP地址
   };
   struct in_addr {
       uint32_t s_addr;
   }

監(jiān)聽端口號 -> int listen(int sockfd, int backlog);

接收用戶請求 -> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

從socket中讀取字符 -> ssize_t read(int fd, void *buf, size_t count);

關閉socket -> int close(int fd);

客戶機:

fd:同服務器端fd。

fd、buf、count:同read中意義。

大于0表示寫了部分或全部數(shù)據(jù),小于0表示出錯。

sockfd客戶端的sock描述字。

addr:服務器的地址。

addrlen:socket地址長度。

創(chuàng)建socket -> int socket(int domain, int type, int protocol);

連接指定計算機 -> int connect(int sockfd, struct sockaddr* addr, socklen_t addrlen);

向socket寫入信息 -> ssize_t write(int fd, const void *buf, size_t count);

關閉oscket -> int close(int fd);

84、TCP 協(xié)議如何保證可靠傳輸?

第一種回答確認和重傳:接收方收到報文就會確認,發(fā)送方發(fā)送一段時間后沒有收到確認就會重傳。數(shù)據(jù)校驗:TCP報文頭有校驗和,用于校驗報文是否損壞。數(shù)據(jù)合理分片和排序:tcp會按最大傳輸單元(MTU)合理分片,接收方會緩存未按序到達的數(shù)據(jù),重新排序后交給應用層。而UDP:IP數(shù)據(jù)報大于1500字節(jié),大于MTU。這個時候發(fā)送方的IP層就需要分片,把數(shù)據(jù)報分成若干片,是的每一片都小于MTU。而接收方IP層則需要進行數(shù)據(jù)報的重組。由于UDP的特性,某一片數(shù)據(jù)丟失時,接收方便無法重組數(shù)據(jù)報,導致丟棄整個UDP數(shù)據(jù)報。流量控制:當接收方來不及處理發(fā)送方的數(shù)據(jù),能通過滑動窗口,提示發(fā)送方降低發(fā)送的速率,防止包丟失。擁塞控制:當網(wǎng)絡擁塞時,通過擁塞窗口,減少數(shù)據(jù)的發(fā)送,防止包丟失。第二種回答

建立連接(標志位):通信前確認通信實體存在。

序號機制(序號、確認號):確保了數(shù)據(jù)是按序、完整到達。

數(shù)據(jù)校驗(校驗和):CRC校驗全部數(shù)據(jù)。

超時重傳(定時器):保證因鏈路故障未能到達數(shù)據(jù)能夠被多次重發(fā)。

窗口機制(窗口):提供流量控制,避免過量發(fā)送。

擁塞控制:同上。

第三種回答

首部校驗這個校驗機制能夠確保數(shù)據(jù)傳輸不會出錯嗎?答案是不能。

原因

TCP協(xié)議中規(guī)定,TCP的首部字段中有一個字段是校驗和,發(fā)送方將偽首部、TCP首部、TCP數(shù)據(jù)使用累加和校驗的方式計算出一個數(shù)字,然后存放在首部的校驗和字段里,接收者收到TCP包后重復這個過程,然后將計算出的校驗和和接收到的首部中的校驗和比較,如果不一致則說明數(shù)據(jù)在傳輸過程中出錯。

這就是TCP的數(shù)據(jù)校驗機制。但是這個機制能夠保證檢查出一切錯誤嗎?顯然不能。

因為這種校驗方式是累加和,也就是將一系列的數(shù)字(TCP協(xié)議規(guī)定的是數(shù)據(jù)中的每16個比特位數(shù)據(jù)作為一個數(shù)字)求和后取末位。但是小學生都知道A+B=B+A,假如在傳輸?shù)倪^程中有前后兩個16比特位的數(shù)據(jù)前后顛倒了(至于為什么這么巧合?我不知道,也許路由器有bug?也許是宇宙中的高能粒子擊中了電纜?反正這個事情的概率不為零,就有可能會發(fā)生),那么校驗和的計算結果和顛倒之前是一樣的,那么接收端肯定無法檢查出這是錯誤的數(shù)據(jù)。

解決方案

傳輸之前先使用MD5加密數(shù)據(jù)獲得摘要,跟數(shù)據(jù)一起發(fā)送到服務端,服務端接收之后對數(shù)據(jù)也進行MD5加密,如果加密結果和摘要一致,則認為沒有問題

85、UDP是什么

提供無連接的,盡最大努力的數(shù)據(jù)傳輸服務(不保證數(shù)據(jù)傳輸?shù)目煽啃裕?/p>

86、TCP和UDP的區(qū)別

1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接

2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付

3、TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結構的字節(jié)流;UDP是面向報文的

UDP沒有擁塞控制,因此網(wǎng)絡出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)

4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信

5、TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)

6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

7、UDP是面向報文的,發(fā)送方的UDP對應用層交下來的報文,不合并,不拆分,只是在其上面加上首部后就交給了下面的網(wǎng)絡層,論應用層交給UDP多長的報文,它統(tǒng)統(tǒng)發(fā)送,一次發(fā)送一個。而對接收方,接到后直接去除首部,交給上面的應用層就完成任務了。因此,它需要應用層控制報文的大小

TCP是面向字節(jié)流的,它把上面應用層交下來的數(shù)據(jù)看成無結構的字節(jié)流會發(fā)送,可以想象成流水形式的,發(fā)送方TCP會將數(shù)據(jù)放入“蓄水池”(緩存區(qū)),等到可以發(fā)送的時候就發(fā)送,不能發(fā)送就等著TCP會根據(jù)當前網(wǎng)絡的擁塞狀態(tài)來確定每個報文段的大小。

87、UDP的特點有哪些(附贈TCP的特點)?

UDP是無連接的;UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態(tài)(這里面有許多參數(shù));UDP是面向報文的;UDP沒有擁塞控制,因此網(wǎng)絡出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應用很有用,如IP電話,實時視頻會議等);UDP支持一對一、一對多、多對一和多對多的交互通信;UDP的首部開銷小,只有8個字節(jié),比TCP的20個字節(jié)的首部要短。

那么,再說一次TCP的特點:

TCP是面向連接的。(就好像打電話一樣,通話前需要先撥號建立連接,通話結束后要掛機釋放連接);每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點的(一對一);TCP提供可靠交付的服務。通過TCP連接傳送的數(shù)據(jù),無差錯、不丟失、不重復、并且按序到達;TCP提供全雙工通信。TCP允許通信雙方的應用進程在任何時候都能發(fā)送數(shù)據(jù)。TCP連接的兩端都設有發(fā)送緩存和接收緩存,用來臨時存放雙方通信的數(shù)據(jù);面向字節(jié)流。TCP中的“流”(stream)指的是流入進程或從進程流出的字節(jié)序列!懊嫦蜃止(jié)流”的含義是:雖然應用程序和TCP的交互是一次一個數(shù)據(jù)塊(大小不等),但TCP把應用程序交下來的數(shù)據(jù)僅僅看成是一連串的無結構的字節(jié)流。

88、TCP對應的應用層協(xié)議

FTP:定義了文件傳輸協(xié)議,使用21端口.Telnet:它是一種用于遠程登陸的端口,23端口SMTP:定義了簡單郵件傳送協(xié)議,服務器開放的是25號端口。POP3:它是和SMTP對應,POP3用于接收郵件。

89、UDP對應的應用層協(xié)議

DNS:用于域名解析服務,用的是53號端口SNMP:簡單網(wǎng)絡管理協(xié)議,使用161號端口TFTP(Trival File Transfer Protocal):簡單文件傳輸協(xié)議,69

90、數(shù)據(jù)鏈路層常見協(xié)議?可以說一下嗎?

協(xié)議名稱作用ARP地址解析協(xié)議根據(jù)IP地址獲取物理地址RARP反向地址轉換協(xié)議根據(jù)物理地址獲取IP地址PPP點對點協(xié)議主要是用來通過撥號或專線方式建立點對點連接發(fā)送數(shù)據(jù),使其成為各種主機、網(wǎng)橋和路由器之間簡單連接的一種共通的解決方案“

91、Ping命令基于哪一層協(xié)議的原理是什么?

ping命令基于網(wǎng)絡層的命令,是基于ICMP協(xié)議工作的。

92、在進行UDP編程的時候,一次發(fā)送多少bytes好?

當然,這個沒有唯一答案,相對于不同的系統(tǒng),不同的要求,其得到的答案是不一樣的。

我這里僅對像ICQ一類的發(fā)送聊天消息的情況作分析,對于其他情況,你或許也能得到一點幫助:首先,我們知道,TCP/IP通常被認為是一個四層協(xié)議系統(tǒng),包括鏈路層,網(wǎng)絡層,運輸層,應用層.UDP屬于運輸層,

下面我們由下至上一步一步來看:以太網(wǎng)(Ethernet)數(shù)據(jù)幀的長度必須在46-1500字節(jié)之間,這是由以太網(wǎng)的物理特性決定的.這個1500字節(jié)被稱為鏈路層的MTU(最大傳輸單元).但這并不是指鏈路層的長度被限制在1500字節(jié),其實這這個MTU指的是鏈路層的數(shù)據(jù)區(qū).并不包括鏈路層的首部和尾部的18個字節(jié).

所以,事實上,這個1500字節(jié)就是網(wǎng)絡層IP數(shù)據(jù)報的長度限制。因為IP數(shù)據(jù)報的首部為20字節(jié),所以IP數(shù)據(jù)報的數(shù)據(jù)區(qū)長度最大為1480字節(jié).而這個1480字節(jié)就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數(shù)據(jù)報的.又因為UDP數(shù)據(jù)報的首部8字節(jié),所以UDP數(shù)據(jù)報的數(shù)據(jù)區(qū)最大長度為1472字節(jié).這個1472字節(jié)就是我們可以使用的字節(jié)數(shù)。

當我們發(fā)送的UDP數(shù)據(jù)大于1472的時候會怎樣呢?這也就是說IP數(shù)據(jù)報大于1500字節(jié),大于MTU.這個時候發(fā)送方IP層就需要分片(fragmentation).把數(shù)據(jù)報分成若干片,使每一片都小于MTU.而接收方IP層則需要進行數(shù)據(jù)報的重組.這樣就會多做許多事情,而更嚴重的是,由于UDP的特性,當某一片數(shù)據(jù)傳送中丟失時,接收方便無法重組數(shù)據(jù)報.將導致丟棄整個UDP數(shù)據(jù)報。

因此,在普通的局域網(wǎng)環(huán)境下,我建議將UDP的數(shù)據(jù)控制在1472字節(jié)以下為好.

進行Internet編程時則不同,因為Internet上的路由器可能會將MTU設為不同的值.如果我們假定MTU為1500來發(fā)送數(shù)據(jù)的,而途經(jīng)的某個網(wǎng)絡的MTU值小于1500字節(jié),那么系統(tǒng)將會使用一系列的機制來調整MTU值,使數(shù)據(jù)報能夠順利到達目的地,這樣就會做許多不必要的操作.

鑒于Internet上的標準MTU值為576字節(jié),所以我建議在進行Internet的UDP編程時.最好將UDP的數(shù)據(jù)長度控件在548字節(jié)(576-8-20)以內

93、TCP 利用滑動窗口實現(xiàn)流量控制的機制?

流量控制是為了控制發(fā)送方發(fā)送速率,保證接收方來得及接收。TCP 利用滑動窗口實現(xiàn)流量控制。

TCP 中采用滑動窗口來進行傳輸控制,滑動窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù)。發(fā)送方可以通過滑動窗口的大小來確定應該發(fā)送多少字節(jié)的數(shù)據(jù)。當滑動窗口為 0 時,發(fā)送方一般不能再發(fā)送數(shù)據(jù)報,但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù)。

例如,允許用戶終止在遠端機上的運行進程。另一種情況是發(fā)送方可以發(fā)送一個 1 字節(jié)的數(shù)據(jù)報來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動窗口大小。

94、可以解釋一下RTO,RTT和超時重傳分別是什么嗎?

超時重傳:發(fā)送端發(fā)送報文后若長時間未收到確認的報文則需要重發(fā)該報文?赡苡幸韵聨追N情況:

發(fā)送的數(shù)據(jù)沒能到達接收端,所以對方?jīng)]有響應。

接收端接收到數(shù)據(jù),但是ACK報文在返回過程中丟失。

接收端拒絕或丟棄數(shù)據(jù)。

RTO:從上一次發(fā)送數(shù)據(jù),因為長期沒有收到ACK響應,到下一次重發(fā)之間的時間。就是重傳間隔。

通常每次重傳RTO是前一次重傳間隔的兩倍,計量單位通常是RTT。例:1RTT,2RTT,4RTT,8RTT......

重傳次數(shù)到達上限之后停止重傳。

RTT:數(shù)據(jù)從發(fā)送到接收到對方響應之間的時間間隔,即數(shù)據(jù)報在網(wǎng)絡中一個往返用時。大小不穩(wěn)定。

<上一頁  1  2  3  4  下一頁>  余下全文
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號