對Socket、UDP和TCP相關(guān)內(nèi)容的學(xué)習(xí)筆記(一)

參加比賽沒表現(xiàn)好,被批了一頓。擺爛了很久,都不好意思寫技術(shù)博客了?,F(xiàn)在感覺,反正開擺了就做點(diǎn)想做的事吧,顧慮那么多干啥,矛盾。于是又來臭不要臉地寫博客了。
說回博客主題,說實(shí)話我對這方面的東西也不是很懂。學(xué)校計(jì)網(wǎng)講得也不是很清楚,主要是面向考試。所以這篇東拼西湊湊出來的筆記很可能是有問題的,歡迎各位讀者大大指出。
Socket是什么?
很簡單,查字典就知道了。是插座!啊不對,是套接字!
曾經(jīng)在知乎看到Invalid?s佬在一篇關(guān)于API設(shè)計(jì)的回答里提到過Socket的設(shè)計(jì)思路。
按他的描述來看,Socket?API把對客戶端的Socket抽象成了“網(wǎng)線插頭”,把底層協(xié)議抽象成了“虛擬網(wǎng)線”:
通過connect函數(shù)來把插頭插到對應(yīng)的插座。期間可以通過read或write來發(fā)送或者接收消息。最后調(diào)用close函數(shù)拔掉插頭。
而對服務(wù)端的Socket則是抽象成了“網(wǎng)線插座”:用bind來定好插座,然后listen來處理連接請求。然后accept連接請求來建立一個(gè)專線。
感覺講得挺好我就在這照搬了。就像把OpenGL理解成一個(gè)排滿開關(guān)然后留有幾個(gè)插件接口的巨大機(jī)器;把Mentle-like API理解成拼裝一個(gè)制作圖片的流水線一樣。感覺學(xué)習(xí)這種東西的時(shí)候,在腦子里類比/模擬出來一個(gè)模型更能加深理解。
最后補(bǔ)充一下私貨。我認(rèn)為Socket和OpenGL、DX等一眾圖形API是類似的,是一種約定(也許應(yīng)該叫協(xié)議?)。各個(gè)廠商心照不宣做出來的一個(gè)網(wǎng)絡(luò)接口,雖然看起來差不多但總在一些小細(xì)節(jié)上會有點(diǎn)點(diǎn)區(qū)別的感覺。
端口又是什么?
我在開始打算寫這個(gè)文章之前,我甚至都沒產(chǎn)生過這樣的疑問。在之前我一直以為一個(gè)Socket連接對應(yīng)的就是一個(gè)端口。重新思考TCP之后才意識到可能端口和Socket并不是一一對應(yīng)的。
在查找資料時(shí),看到資料中的描述是:一個(gè)指定的端口號不能被多個(gè)應(yīng)用程序共用。那么在一個(gè)應(yīng)用程序里面就可以共用一個(gè)端口號嗎?TCP應(yīng)該是可以的。TCP和UDP兩個(gè)不同的傳輸層協(xié)議是否可以共用一個(gè)端口號呢?
為此,我編寫了程序做了點(diǎn)比較糙的實(shí)驗(yàn)。得到了一些結(jié)論。(Rust源碼放在文末)
使用TCP和UDP兩個(gè)不同協(xié)議的Socket是可以共用端口的。
使用UDP協(xié)議的Socket可以自己給自己發(fā)消息。
那么就先到這吧,以后隨緣更新。
源碼
結(jié)論1的源碼
輸出結(jié)果
結(jié)論2的源碼
輸出結(jié)果