網(wǎng)絡(luò)編程相關(guān)


文章主要保存一些網(wǎng)絡(luò)編程的好文相關(guān)鏈接,為尊重作者知識產(chǎn)權(quán),不作轉(zhuǎn)載。持續(xù)更新中。。。

  1. 文章1對socket以及三、四次握手解釋得很清晰,特別是對套接字描述符的抽象解釋得很到位,比較容易給初學(xué)者或者面試補(bǔ)救的人提供一個(gè)清晰的模型。

  2. 文章2包含兩個(gè)部分,Linux/unix IO模式,以及select、poll等IO多路復(fù)用。

IO模式這塊跟《unix網(wǎng)絡(luò)編程》上面的內(nèi)容差不多,也算是一個(gè)總結(jié)。

IO模式主要分同步和異步。同步IO就包含了blocking IO,non-blocking IO,IO multiplexing。因?yàn)閺倪壿嬌现v只要從內(nèi)核拷貝數(shù)據(jù)到內(nèi)存的這段時(shí)間有block發(fā)生,就屬于同步IO.

  1. TCP 連接過程及函數(shù)

server: socket, bind, listen,accept

client: socket, connect

connect 發(fā)起三次握手,accept返回標(biāo)志三次握手結(jié)束。connect不阻塞但有等待響應(yīng)機(jī)制,第一次連不上,等6s再連,再等24s.通常等75秒以上返回超時(shí)。如果server端沒服務(wù),直接返回refused。

accpet阻塞等待建立連接。

bind是將眾所周知端口和IP綁定到一起以便client端到server端的通信。否則通信端口將由內(nèi)核分配。不管是TCP還是UDP,server端都必須bind,client只有兩種情況下需要bind。

  • 連接建立前就需要知道端口則bind;
  • 以指定的端口進(jìn)行通信則bind。
  1. read/write

read/write不是端對端調(diào)用,讀寫對象為讀寫緩沖區(qū),即write不阻塞等待read準(zhǔn)備好。相反read會阻塞等待讀緩沖區(qū)可讀。write的次數(shù)和read的次數(shù)也不一一對應(yīng)。write向?qū)懢彌_區(qū)寫,通常大小為內(nèi)容大小。read向讀緩沖區(qū)讀,大小由自己決定。

  1. UDP通信
    UDP不需要建立連接,所以不需要listen,也不需要accept. UDP server 可以后啟動。通常這種模式
    server: socket, bind, recvfrom
    client: socket, (connect), sendto
    由于無連接,recvfrom/sendto都包含了地址信息。所以,當(dāng)對端沒準(zhǔn)備好時(shí),也不返回出錯信息。所以UDP不可靠,sendto只管發(fā)送出去,不管對端有沒有準(zhǔn)備好接收。

connect 可用可不用,UDP的connect與TCP完全不同,UDP不需要三次握手,這里的connect只是讓內(nèi)核記錄下對端的IP和Port. 不用每次發(fā)報(bào)都建立連接,斷開連接。同樣的例子,對端沒啟來,UDP connect不會有等待響應(yīng)機(jī)制,也不會返回connection refused. 程序可以繼續(xù)運(yùn)行。

另外,UDP可以多次調(diào)用connect,通常是在connection斷開或者IP改變后。TCP只能connect一次。
UDP使用connect還有以下優(yōu)點(diǎn),

  • 提高效率,不用每次都建立連接;
  • 高并發(fā)服務(wù)中增加系統(tǒng)穩(wěn)定性,避免端口復(fù)用;
  • 可以使用read/write函數(shù),這樣如果服務(wù)端沒啟動,write可以返回connection refused.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容