能不能不使用Socket進行網路通信?
01-27
能不能不使用Socket進行網路編程 通信?
如果自己 寫程序和網卡硬體驅動打交道,是否可行,需要怎麼做?
目標:寫一個程序實現 不通過Socket 不通過TCP/IP協議棧(都自己實現),直接和網卡驅動交互並高性能管理網路連接的收發工作。
顯然目前是不能的。在最初沒有出現互聯網的時候,在區域網之間直接通過網卡上的MAC地址來通信,也就是遵循「乙太網協議」,發送的數據只有鏈路層信息。這種方式要發送消息的話,會直接在區域網進行廣播也就是對區域網每一個主機都發送數據包,收到數據包的主機會解析數據包頭部的MAC地址來確定是不是發給自己的。那麼當互聯網出現之後,比如在美國紐約的一台主機和我大天朝上海的一台主機顯然不是在一個區域網內,況且就算把整個互聯網看成一個區域網,那麼廣播的代價是巨大的還有延時問題就無法想像了。socket的出現就是為了解決這個問題的,這也就是出現網路層和傳輸層的必要性,網路層通過IP地址來確定具體要發送消息的區域網,鏈路層MAC地址來確定具體區域網的某一台主機,而傳輸層的頭部也就是TCP/UDP的頭部來確定埠號port來找到具體是應用層哪一個應用需要得到傳輸層後面的具體數據。socket簡單說就是一個介面,俗稱「套接字」,用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信,通過上面可以知道ip+port可以唯一識別一台主機上的唯一應用。協議的出現就是一個規範,大家都按照這個走,網路就可以進行,如果每一個人都定義一個自己的協議,那麼網路直接還能夠通信嗎??(攤手),所以自己有這個想法可能是好的,但是一定要明白現在的協議為什麼要這麼做,同時想要改寫的話必須要得到世界的認可啊,前路漫漫,祝好。
Socket 是什麼
Socket 是一組 API。現在常見的 OS 都通過內核提供這個 socket API 供所有程序使用。
如果自己 寫程序和網卡硬體驅動打交道,是否可行,需要怎麼做?
http://dpdk.org
or, search for "user-space tcp/ip stack"推薦閱讀:
※如何解決長城寬頻主動斷開tcp長連接的問題?
※epoll非阻塞伺服器,在20k並發測試結束產生大量establish狀態假連接,可能原因?
※用 wireshark抓包工具能做到哪些有趣的事情?
※為什麼 ssh root@163.com 或者 ssh root@zhihu.com 都沒有反應?
※最近在nginx1.9.1中支持了reuse_port這個功能 是准許多個socket監聽同一個埠?