1. 程式人生 > >Python小白__網路層級

Python小白__網路層級

Python小白__網路分析

         剛剛開始接觸Python,為了怕遺忘,所以寫個博文方便自己回顧,也可以和大家分享,有不同意見,大家共同探討學習。

網路層級

         第一篇是對於網路的一些看法和感想,不只是Python

   眾做周知,在現在的網路時代,最重要的就是網路通訊,通訊的方式有甚多 ,有Http,TCP,UDP等等,其不同程式語言實現方式也很多,但是底層的通訊原理都相差不多。所以就有了一個網路通訊的網路層級之分。

         一般網路層級分為四層,分別為:應用層,傳輸層,網路層,鏈路層。

假如現在A要傳遞一條資料給B

          應用層:決定了A需要傳遞什麼資料給B,並且保證B可以解析這個資料

         傳輸層:決定如何傳輸資料【UDP 或TCP】(可以理解為快遞公司)

         網路層:有一個唯一的標識,一般是IP (相當於收件的地理位置座標)

         鏈路層:具體的傳輸工具,光纖或者Wifi等等(相當於快遞空運或者車運)

        這樣,你想要傳送的資料,就會像快遞一樣,傳送給B啦

對於TCP和UDP的一些想法

       對於平常接觸和使用來說,TCP肯定是多餘UDP太多的,因為其封裝的更加的簡單方便,易於實現和使用,和朋友談論,也經常受到他們的的“教導”,除非你正在寫一個動作類的遊戲,否則,你就用TCP吧,甚至即使在MMO遊戲也會推薦你用TCP,畢竟大名鼎鼎的魔獸,就是使用的TCP通訊。遺憾的是他們和我的想法總是不能達成一致。

         首先說明一下,TCP依舊是我目前工作使用的主流,因為在資料量不大的情況下,TCP是一種安全且常見的選擇,儘管如此,當我在嘗試克服陌生的恐懼開始接觸UDP和TCP底層執行機制以後,才知道。當每次伺服器達到峰值,在有時3G或者WiFi的情況下,Ping值上升到1000多毫秒的原因。

         先說說TCP的優勢:

                   簡單直接的長連線

                   可靠的資訊傳輸

                   資料包大小沒有限制

         但是,任何一個和TCP打過交道的人都知道,要實現一個穩定的TCP網路連線,需要處理各種隱藏的坑,比如斷線檢測,慢速客戶端相應,阻塞資料包,對開放連線的各種DOS共計,阻塞和非阻塞IO模型等等。

         當這些能夠很好的避開以後,最大的問題就是TCP最糟糕的特性->他對阻塞的控制,一般來說,TCP假定丟包是由於頻寬不夠造成的,所以發生這種情況,TCP就會減少發包的速度。在3G或者Wifi的情況下,你希望的是立馬重新發這個資料包,然而TCP阻塞機制卻完全採用了相反的方式來處理,並且沒有任何辦法能夠繞過這個機制,因為他是構建TCP協議的基礎,所以,這就是為什麼在有時3G或者WiFi的情況下,Ping值上升到1000多毫秒的原因。

為什麼不用UDP?

         UDP相對於TCP來說,既簡單又困難。因為UDP只是使用一個Socket通訊,不想TCP一個客戶端一個建立一個Socket,TCP一些基本的連線概念,一些包序功能和所謂的連線可靠性,這些UDP都沒辦法簡單的提供給你。這就是人們為什麼更加推薦TCP的原因。在用TCP的時候,你雖然不用考慮哪些問題,但是當連線數達到500以上的時候,這個時候TCP會有明顯很大的延遲,是的UDP沒有提供所有的解決方法,但正如你看到的那樣,這也正是UDP好用的地方,從某種意義上說,TCP對UDP就好比是HIbernate和手寫SQL的區別。

         其實魔獸的Ping值也是達到了1000毫秒以上,他們也只是用了一些延遲處理機制,比如Nagle演算法,預測行為,等等,讓玩家不易察覺這種延遲。但是當兩個玩家碰撞的話,這種預測就顯得蒼白無力了,這裡我也不再過多贅述、

那麼到底使用UDP還是TCP呢?

         如果你的需求是客戶端間歇性的發起無狀態的查詢,並且偶爾發聲延遲是可以容忍的,那麼可以使用HTTP/HTTPS

         如果你的客戶端和伺服器丟可以獨立發包,但是偶爾發生延遲可以容忍,比如線上的紙牌遊戲,那麼建議使用TCP長連線

         如果客戶端和伺服器都可以獨立發包,並且無法忍受延遲(比如大多數人的多人動作遊戲)那麼使用UDP吧

         更新的話,最好是用HTTP去獲取上次更新內容,然後使用UDP跟遊戲伺服器連線。