建立連接與關閉連接

  • 總覽
tcp狀態機,來自網路,侵刪

  • 三次握手
    • 握手流程 雙方交換seq,作為後續數據交互的憑證。確認、重傳都需要用到seq
    • 為什麼是三次握手
      • client 發給server seq x並需要確認server收到
      • server回復ack並發送自己的seq y
      • client回復server ack
      • seq->ack 兩個來回,優化了下,變成3次
      • tcp不會為沒有payload的ack做重傳
      • client端收到ack之後,就認為established
    • sync超時與sync flood攻擊
      • 連接建立的sync包,丟失,會重試5次,共計耗時63s後才斷開
      • 通過發sync不回ack,可以攻擊伺服器
      • tcp_syncookies設置可以部分解決這個問題 就是加一個簡單的challenge過程,用cookie校驗有效性
  • 四次揮手
    • time_wait狀態作用
      • 保證FIN能重發,注意,ack不會重發, fin會
      • 如果埠被複用,保證不會新舊連接混
  • 半開、半閉
    • 半開 client發送連接請求,三次握手沒完全建立之前

      此時有個半連接隊列,保存連接請求

    • 半閉:一方調用了shutdown,另一方還未shutdown的狀態
    • 半開連接是不能正常傳輸數據的,而半關連接是可以在其中的一個方向上傳輸數據的

tcp可靠性揭祕

重傳

  • 超時重傳
    • 時間驅動
  • 快速重傳
    • 事件驅動重傳
    • 無法確定重傳哪些數據
  • SACK
    • 快速重傳的改進版,發送包根據ack確定重發哪些包

滑動窗口

  • 接收端告訴發送端自己還有多少緩衝區可以接收數據。於是發送端就可以根據這個接收端的處理能力來發送數據,而不會導致接收端處理不過來。
  • 注意如果滑動窗口變成0,send無法成功,errorno會被設置為EAGAIN或是EWOULDBLOCK(boost裡面表現為不callback), 這種情況下需要做下處理

超時計算

  • RTT round trip time,
  • RTO 請求重傳時間
  • 計算RTO的各種演算法
    • 加權

socket編程細節

  • accept
    • tcp三次握手已經完成,返回fd操作socket
  • shutdown, close的區別
    • shutdown 不管fd的引用計數,直接發FIN
    • close將fd引用計數-1,若變成0,發FIN
  • SOCKOPT 參數
    • so_reuse 埠馬上復用
    • so_no_delay 設置為1,馬上發

常用指令

  • netstat
    • a, t, n

      all, tcp, udp

    • s 統計
    • l listen
  • tcpdump
    • tcpdump -X -s 0 -n -i interface port portnum 16進位
    • tcpdump -A -s 0 -n -i interface port portnum ASCII
    • 支持各種狀態,各種包

網路參數調優

常用的socket調優參數

ref

TCP 為什麼是三次握手,而不是兩次或四次??

www.zhihu.com圖標Linux內核 TCP/IP、Socket參數調優?

www.cnblogs.com
圖標

推薦閱讀:

相關文章