如何思考並解決網路編程中的問題?

在socket 和多線程這兩部分選擇面試題, 哪些知識點比較能看出對方的水平? - 面試問題下面,陳碩老師給出了結合TCP/IP在各種條件下的程序表現,這些問題我在面試中也遇到過,實在沒有好的解題思路。我有兩個問題:1. 基本的TCP/IP,進程知識都學過,卻沒有明確的思路;2. 這些問題我也沒有好的google方法可以得到較為系統的解答。希望能得到大家的解惑。


獻醜了~

  • 進程 crash 會怎麼樣
  • crash了kernel會發icmp,socket會斷掉。

  • 進程 deadlock 會怎麼樣
  • 會一直掛著吧,會發出去對方也不收,最終所有buffer都滿掉,然後send timeout。

  • 進程或機器過載,反應變慢會怎麼樣
  • 會收發都慢一點,現在網卡都比較牛了,應該基本不至於丟包。

  • 進程死循環,拚命發消息會怎麼樣
  • tcp有擁塞控制,所以看對方收不收吧。即便對方全收了, 也會有back pressure,然後一點點漲上去。

  • 機器重啟會怎麼樣
  • 會沒有響應,最終timeout;也有可能retry的時候能得到點響應,比如又連上了,或者收到一個icmp然後斷掉,如果ip地址沒換掉的話。

  • 機器死機會怎麼樣
  • 那就只能timeout了。網路世界的黃金定律是你永遠無法區分對方是死掉了還是只是離你非常遠。

  • 機器網卡抽風,丟包嚴重會怎麼樣
  • 會不斷重傳吧,進度十分緩慢。

  • 交換機或路由器壞了或過載會怎麼樣
  • 怎麼個壞法?直接把包都扔了?那和機器死機效果一樣吧,都是timeout吧,另一端區分不出來的。其他壞法另說……

  • 路由器過熱重啟會怎麼樣
  • 如果是一個子網下的,ip層可能會短暫斷一下。tcp連接會頓一下,可能會丟幾個包降一下window size,然後如果恢復的快的話基本不受什麼大影響,當然需要假設沒有dhcp或者dhcp沒有重新分配不一樣的地址。

    如果不是一個子網的並且路由做了NAT,那就另說了,看路由能不能恢復重啟前的狀態了。

  • A和B之間的帶寬被別的服務佔用了會怎麼樣
  • 如果也是tcp或者其他有擁塞控制的協議,理論上會大家平分,實際會看到鋸齒形狀的抖動。沒有擁塞控制的協議就全看心情了……

    防火牆可能會把icmp過濾掉,所以會timeout。
    高級一點的防火牆還可能會做帶寬限制和整流。
    再高級一點的防火牆在tcp的數據滿足一定條件的時候主動而霸道地給你發RST……

    問題作者:陳碩
    鏈接:socket 和多線程這兩部分選擇面試題, 哪些知識點比較能看出對方的水平? - 陳碩的回答
    來源:知乎
    著作權歸作者所有,轉載請聯繫作者獲得授權。


    推薦閱讀:

    windows 利用socket實現從http下載?
    想問下php的socket的工作流程是什麼?
    Socket是一個好的設計嗎?
    有沒有哪些高效的c++ socket框架?
    Socket建立連接到底發生了什麼?

    TAG:面試 | 計算機網路 | Socket | 網路編程 |