網絡編程 併發socketserver

網絡編程 併發socketserver

  • ipv四、ipv6python

    • ip協議:規定網絡地址的協議
  • B/S架構 C/S架構 bs是cs的一種算法

    • B/S是瀏覽器和服務端架構
    • C/S是客戶端和服務端架構
  • osi七層協議編程

    • 機器與機器之間按照約定的協議對信息的解析
  • osi五層協議瀏覽器

    • 應用層 HTTP、ftp、https、smtp協議
    • 傳輸層 端口、tcp、udp協議 四層交換機,四層路由器
    • 網絡層 ipv4 ipv6協議 三層交換機,路由器
    • 數據鏈路層 mac/arp協議 網卡,以太交換機,網橋
    • 物理層 中繼器,集線器,雙絞線
  • tcp協議/udp協議服務器

    • tcp協議特色 對可靠要求高的長數據網絡

      • 面向鏈接 可靠的慢的流式傳輸架構

      • 三次握手併發

        • TCP三次握手的過程以下:
          客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。
          服務器端收到SYN報文,迴應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。
          客戶端收到服務器端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態。
          三次握手完成,TCP客戶端和服務器端成功地創建鏈接,能夠開始傳輸數據了
      • 四次揮手socket

        • (1) 某個應用進程首先調用close,稱該端執行「主動關閉」(active close)。該端的TCP因而發送一個FIN分節,表示數據發送完畢。
          (2) 接收到這個FIN的對端執行 「被動關閉」(passive close),這個FIN由TCP確認。
          注意:FIN的接收也做爲一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其餘數據以後,由於,FIN的接收意味着接收端應用進程在相應鏈接上再無額外數據可接收。
          (3) 一段時間後,接收到這個文件結束符的應用進程將調用close關閉它的套接字。這致使它的TCP也發送一個FIN。
          (4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。[1] 
          既然每一個方向都須要一個FIN和一個ACK,所以一般須要4個分節。
          注意:
          (1) 「一般」是指,某些狀況下,步驟1的FIN隨數據一塊兒發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合併成一個分節。[2] 
          (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱爲「半關閉」(half-close)。
          (3) 當一個Unix進程不管自願地(調用exit或從main函數返回)仍是非自願地(收到一個終止本進程的信號)終止時,全部打開的描述符都被關閉,這也致使仍然打開的任何TCP鏈接上也發出一個FIN。
          不管是客戶仍是服務器,任何一端均可以執行主動關閉。一般狀況是,客戶執行主動關閉,可是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。[2]
      • 粘包問題tcp

        • 拆包機制:nagel算法

          • 當發送端緩衝區的長度大於網卡的MTU時,tcp會將此次發送的數據拆成幾個數據包發送出去。
        • 合包機制

    • udp協議 適用 高併發的短消息

      • 面向數據包的無鏈接不可靠的快的短數據的傳輸
      • 不能發生過大的消息
  • arp協議

    • 根據ip地址找mac地址----交換機(廣播,單播)
    • 功能:以廣播的形式發送數據包,獲取目標主機的mac地址
  • 子網掩碼,網段,網關ip

  • socket

  • socketserver

    • 實現了併發的tcp協議的socket的server端

    • import socketserver
      class Myservere(socketserver.BaseRequestHandler):
          def handle(self):
              conn = self.request
      server = socketserver.ThreadingTCPServer(("ip地址,duankou"),Myservere)
      server.serve_forever()
    • 實例代碼

    • server端

      • import socketserver
        class Myserver(socketserver.BaseRequestHandler):
            def handle(self):
                self.data = self.request.recv(1024).strip()
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                self.request.sendall(self.data.upper())
        
        if __name__ == "__main__":
            HOST, PORT = "127.0.0.1", 9999
        
            # 設置allow_reuse_address容許服務器重用地址
            socketserver.TCPServer.allow_reuse_address = True
            # 建立一個server, 將服務地址綁定到127.0.0.1:9999
            server = socketserver.TCPServer((HOST, PORT),Myserver)
            # 讓server永遠運行下去,除非強制中止程序
            server.serve_forever()
    • client端

      • import socket
        
        HOST, PORT = "127.0.0.1", 9999
        data = "hello"
        
        # 建立一個socket連接,SOCK_STREAM表明使用TCP協議
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
            sock.connect((HOST, PORT))          # 連接到客戶端
            sock.sendall(bytes(data + "\n", "utf-8")) # 向服務端發送數據
            received = str(sock.recv(1024), "utf-8")# 從服務端接收數據
        
        print("Sent:     {}".format(data))
        print("Received: {}".format(received))
相關文章
相關標籤/搜索