在進(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)定。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?