在講網絡編程之前,我們先在開頭說一點網絡編程的基礎知識,比計網簡略了不少,希望大家不要把這些知識直接代入到計網的考試中。
網絡可分爲七層/四層
七層從上到下分別是:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層
爲了方便,其實也可以只抽象出四層,從上到下分別是:應用層、傳輸層、網絡層、鏈路層。
應用層:解決了要傳遞什麼數據(傳數據的格式)。
傳輸層:解決如何傳輸數據(分爲UDP和TCP),UDP協議:不保障數據的安全性。
網絡層:IP協議(定位),可以理解爲地理位置座標。
鏈路層:具體的傳輸工具。
只要進行網絡通信,傳輸層、網絡層和鏈路層是一定會涉及到的,應用層不一定(如果不把傳輸的數據抽象出一個協議的話,就用不到應用層)。
下面我們開始講一下簡單的socket編程:
網絡通信的兩端分別是客戶端和服務器,這篇文章的代碼先不考慮應用層,只考慮傳輸層
下圖是socket僞代碼
首先是服務器端先創建一個socket
Socket = socket.socket(AF_INET,SOC_STREAM)
其中STREAM(流)指的是TCP協議,而UDP協議是DGRAM數據報(因爲UDP發過去之後不會確認,也就是隻有一次報文傳輸;而TCP發過去後,只要沒斷開連接,服務器還會返回數據確認收到的報文序號seq、ack等)。
接下來服務器端進行綁定,綁定一個地址和端口
Socket.bind()。
隨後服務器端進行監聽
Socket.listen()。
然後客戶端進行創建與連接
So = socket.socket();So.connect()。
接下來是服務器端的接收
Socket.accept(),實際上是while True循環等待。
之後雙方都可以進行消息的傳送與接收
其中TCP是send()與recv()方法,UDP是sendto()與recvfrom()。
最後是四次揮手
也就是客戶端的close()。
補充一點,代碼中So.connect()與cli_so =
Socket.accept()進行的是著名的三次握手,也就是客戶端先發一個報文seq,服務器接收後給客戶端一個響應ack,客戶端收到響應之後再給服務器一個響應,這些都是由操作系統內核完成的。
希望能對大家有所啓發,作者@dger
,這些都是由操作系統內核完成的。
希望能對大家有所啓發,作者@dger