記一次簡單的網絡編程

在講網絡編程之前,我們先在開頭說一點網絡編程的基礎知識,比計網簡略了不少,希望大家不要把這些知識直接代入到計網的考試中。

網絡可分爲七層/四層

七層從上到下分別是:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層

爲了方便,其實也可以只抽象出四層,從上到下分別是:應用層、傳輸層、網絡層、鏈路層。

應用層:解決了要傳遞什麼數據(傳數據的格式)。

傳輸層:解決如何傳輸數據(分爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章