文章主要保存一些網(wǎng)絡(luò)編程的好文相關(guān)鏈接,為尊重作者知識產(chǎn)權(quán),不作轉(zhuǎn)載。持續(xù)更新中。。。
文章1對socket以及三、四次握手解釋得很清晰,特別是對套接字描述符的抽象解釋得很到位,比較容易給初學(xué)者或者面試補(bǔ)救的人提供一個(gè)清晰的模型。
文章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.
- 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。
- 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ū)讀,大小由自己決定。
- 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.