訂閱
糾錯
加入自媒體

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

服務(wù)器:

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

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

fd:連接描述字。

buf:緩沖區(qū)buf。

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

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

sockfd:服務(wù)器socket描述字。

addr:指向地址結(jié)構(gòu)指針。

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

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

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

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

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

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

addrlen:地址長度。

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

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

protocol:指定協(xié)議。IPPROTO_TCP表示TCP協(xié)議,為0時自動選擇type默認(rèn)協(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地址結(jié)構(gòu)
   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);

關(guān)閉socket -> int close(int fd);

客戶機(jī):

fd:同服務(wù)器端fd。

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

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

sockfd客戶端的sock描述字。

addr:服務(wù)器的地址。

addrlen:socket地址長度。

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

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

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

關(guān)閉oscket -> int close(int fd);

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

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

建立連接(標(biāo)志位):通信前確認(rèn)通信實(shí)體存在。

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

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

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

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

擁塞控制:同上。

第三種回答

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

原因

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

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

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

解決方案

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

85、UDP是什么

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

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

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

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

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

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

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

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

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

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

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

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

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

那么,再說一次TCP的特點(diǎn):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

超時重傳:發(fā)送端發(fā)送報文后若長時間未收到確認(rèn)的報文則需要重發(fā)該報文。可能有以下幾種情況:

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

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

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

RTO:從上一次發(fā)送數(shù)據(jù),因?yàn)殚L期沒有收到ACK響應(yīng),到下一次重發(fā)之間的時間。就是重傳間隔。

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

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

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

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

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

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

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

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