網路編程必須使用socket嗎?

Socket本身並不是協議,而是對TCP/IP協議的封裝,是一個調用介面(API),通過Socket我們才能使用TCP/IP協議。

1.瀏覽器,IM,流媒體等等所有應用層的程序必須通過socket才能進行網路通信嗎?
2.瀏覽器,web server底層都是通過Socket連接嗎?
3.不通過socket的話,自己需要做哪些工作?
相關討論:
不用WinSock、CSocket,只用Win32進行網路編程...應該怎麼理解?


既然題主提到的是Windows,那Windows上面當然還有一系列其他的工具,譬如說https://msdn.microsoft.com/en-us/library/windows/desktop/aa384081(v=vs.85).aspx 或者 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364703(v=vs.85).aspx 。如果你不局限於C++就更簡單了,.net封裝出來的東西好用的一比,下面還自己使用了IOCP,你什麼事情都不用管,每次掛一個callback上去就好了。


自己組裝IP數據包 直接寫網卡


tcp 協議是一個權衡了各種網路資源、主機資源、可靠性、穩定性等等因素的結果,socket 只是 tcp 實現所提供的 API。

雖然你問題提的是關於不使用 socket 怎麼寫網路應用的,但我猜你想問的應該是不使用 tcp 怎麼寫網路應用(比如寫一個 IM 軟體),因為我們也可以通過 socket 使用 udp。

所以,不使用 tcp 而使用 udp,那你的程序就需要實現 tcp 的功能(假設你需要),如數據包重排序、擁塞控制、流量控制等等。

如果你連 udp 都不想用,那可以自己封 IP 包,做包切分等等,換句話說你在實現整個網路協議棧裡面挺關鍵的一部分。也就是說越往底層你要做的事情就越多。


在 Linux 上是的,因為內核只給應用層提供了這一套介面。
當然沒有任何東西阻止你去實現另一套介面。


大部分情況下socket就夠用了.....如果是windows的話....你可以自己寫一個ndis協議驅動然後在用戶層通過createfile,writefile,readfile來收發網路數據....這麼搞的用處就是發送自己拼的arp包做欺騙啊或者監視本機所有網路數據包(其實rawsocket也能自己封IP包頭,但是windows下rawsocket來弄TCP好像xp以後就被封了).....不過有個東西叫winpcap....他已經把上述動作做好了,你要做的只是熟悉api.....


一般是的,如果你不需要保證數據正確性,你可以用UDP,如果你不需要保證你說的別人能聽懂,那你隨便怎麼搞都行,到時候路由器都不一定幫你轉發


c,c++用winpcap,java jpcap。


當然不一定,常見的socket編程可以理解為操作系統向程序員提供的TCP/IP協議介面。
最近項目需要,了解了NVMe和RDMA,發現TCP/IP成為了這種高速存儲場景下的瓶頸。這樣場景下,都恨不得直接到硬體。
所以,你可以自己定義並實現一套協議,適用性不談,底層能力和對網路知識的掌握肯定提升一大截。


socket是網路數據傳輸層主要技術手段,要傳遞網路信息的大都是靠socket實現的。就拿jsp來舉例把,jsp在是這麼傳輸數據的:先轉換成servlet,再編譯為.class位元組碼servlet底層是socket,jsp所轉化的servlet是HttpServlet,它是對http協議的封裝。你可以去web伺服器比如tomcat下的work文件夾看看,裡面都是jsp轉換的servelt以及他們的位元組碼.class文件。總的來說呢,底層到高層這麼來的:socket-&>HttpServlet-&>JSP所以你非要說jsp底層是有socket實現的也沒錯。


為毛 我問了一個類似的問題 居然無人問津
那我也來回答一發吧
Socket 是什麼,能不能不使用Socket進行網路通信? - TCP/IP
其實 我也知道Socket 是啥,我主要就是想問 怎樣脫離Socket 進行網路編程。

其實我心中有幾個方案的,當然我沒讀過TCP/IP協議族 之類的書,概念方面的錯誤肯定是大大的有。

途徑1:直接寫個NDIS驅動,跳過Socket層,然後 通過和驅動通信控制 網路收發。

途徑2:脫離Windows系統,自己實現自己的系統,自己安排網路方面的邏輯。

途徑3:自己實現TCP/IP 協議棧,繞過系統提供的 Socket 介面(這個可能還是要涉及到驅動和1有點相似)。

途徑4:寫個程序直接與網卡驅動通信。。。但是交互API 或者說協議 不知道怎麼找 如何用。。。

途徑5:暫時還不知道別的方法


按照你目前的理解(根據你的問題推測), 你可以認為是, 只要記住socket介面是操作系統提供給上層應用程序的網路通訊介面(可以認為是一種事實上的標準). 如果你不想用socket介面請說出你為什麼不想。


不清楚題主怎麼定義「網路編程」的。
也許RPC框架對你有幫助,RPC封裝了socket細節。


如果你想用網路編程找到一份好工作,是的


操作系統給你啥就用啥


不是必須使用。

socket只針對TCP/IP協議,能快速地實現TCP/IP通訊。

你可以自己編程實現這個;也不一定非得使用TCP/IP協議通訊,比如利用樹莓派的GPIO介面自己寫一套通訊協議。


socket方便啊。不用一個bit一個bit的來組包。
比如你要發送一個packet,不用socket的話,你需要把目的mac,源mac,ip header,payload,CRC等等全部手動填好,但是有了socket,你只需要填寫目的ip address和payload基本就可以了。


推薦閱讀:

E2E RTT的具體含義?
使用tracert命令時,在一個節點後所有的節點都沒有數據,這是為什麼?
在具體的實現中 TCP 是如何處理失序的數據包?
為什麼使用tcpdump觀察三次握手的過程,最後一次握手後,ack變為1而不是y+1?
花生殼DDNS是什麼?

TAG:Socket | 網路編程 | TCPIP |