天天看點

TCP/UDP學習(一)TCP/UDP學習(一)前言一、UDP二、TCP三、問題與解決方法總結參考

TCP/UDP學習(一)

文章目錄

  • TCP/UDP學習(一)
  • 前言
  • 一、UDP
    • 1.使用python建立UDP套接字的步驟
    • 2.代碼示例
  • 二、TCP
    • 1.使用python建立TCP套接字的步驟
    • 2.代碼示例
  • 三、問題與解決方法
    • 1、UDP
    • 2、TCP
  • 總結
  • 參考

前言

鞏固學習的知識。

一、UDP

UDP全稱User Datagram Protocol,即使用者資料報協定,是一種面向無連接配接的協定,作用在OSI模型中的傳輸層。

1.使用python建立UDP套接字的步驟

  • 建立套接字
  • 綁定本地的相關資訊
  • 等待接收對方發送過來的資料
  • 顯示接收的資料
  • 關閉套接字

2.代碼示例

udp伺服器端代碼示例:

import socket


def main():
    # 1.建立套接字
    udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2.綁定套接字
    udp_server_ip = input('綁定的IP位址:')
    udp_server_port = int(input('綁定的端口:'))
    udp_server_addr = (udp_server_ip, udp_server_port)
    udp_server.bind(udp_server_addr)
    # 3.發送/接收消息
    recv_data = udp_server.recvfrom(1024)
    # 4.列印接收到的資訊
    print(recv_data[0], recv_data[1])
    print('伺服器接收到的消息:[%s:%s] : %s' % (recv_data[1][0], recv_data[0][1], recv_data[0].decode('gbk')))
    # 5.關閉套接字
    udp_server.close()


if __name__ == '__main__':
    main()
           

udp用戶端代碼示例:

import socket


def main():
    # 1.建立socket
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2.發送資訊到遠端
    send_msg = input('用戶端需要發送的消息:')
    udp_server_ip = input('伺服器ip位址:')
    udp_server_port = int(input('伺服器端口位址:'))
    udp_server_addr = (udp_server_ip, udp_server_port)
    udp_socket.sendto(send_msg.encode('utf-8'), udp_server_addr)
    # 3.關閉socket
    udp_socket.close()


if __name__ == '__main__':
    main()
           

二、TCP

TCP全稱Transmission Control Protocol,即傳輸控制協定,是一種面向連接配接的、可靠的、基于位元組流的協定,作用在OSI模型中的傳輸層。

1.使用python建立TCP套接字的步驟

用戶端:

  • 建立套接字
  • 連結伺服器
  • 發送/接收消息
  • 關閉 套接字

伺服器端:

  • 建立套接字
  • 綁定伺服器IP位址和端口
  • 監聽
  • 等待連接配接
  • 接收/發送消息
  • 關閉套接字

2.代碼示例

tcp伺服器端代碼示例:

import socket


def main():
    # 1.建立套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.綁定伺服器端IP位址和端口
    server_ip = input('輸入伺服器端IP位址:')
    server_port = int(input('輸入伺服器端port:'))
    tcp_server_socket.bind((server_ip, server_port))
    # 3.監聽
    tcp_server_socket.listen(128)
    # 4.等待連接配接
    new_client_socket, client_info = tcp_server_socket.accept()
    # 5.接收/發送消息
    recv_data = new_client_socket.recv(1024)
    print('接收到用戶端[%s]發送的消息:%s' % (client_info, recv_data.decode('utf-8')))
    send_data = input('回送給用戶端的消息:')
    new_client_socket.send(send_data.encode('utf-8'))
    # 6.關閉套接字
    new_client_socket.close()
    tcp_server_socket.close()


if __name__ == '__main__':
    main()
           

tcp用戶端代碼示例:

import socket


def main():
    # 1.建立套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.連結伺服器
    server_ip = input('tcp伺服器IP:')
    server_port = int(input('tcp伺服器端口:'))
    tcp_socket.connect((server_ip, server_port))
    # 3.發送/接收消息
    recv_data = tcp_socket.recv(1024)
    print('伺服器發送過來的消息: %s' % (recv_data.decode('gbk')))
    send_data = input('請輸入需要給用戶端發送的消息:')
    tcp_socket.send(send_data.encode('gbk'))
    # 4.關閉套接字
    tcp_socket.close()


if __name__ == '__main__':
    main()

           

三、問題與解決方法

1、UDP

2、TCP

總結

UDP:

  • UDP是無連接配接的,即發送資料之前不需要建立連接配接,發送完資料也不需要斷開連接配接,減少了開銷和發送資料前建立連接配接的時延。
  • UDP是盡最大努力傳遞,即不保證可靠傳遞。
  • UDP是面向封包的,對應用程式傳遞下來的封包,在添加首部後就向下傳遞IP層。UDP一次傳遞一個完整的封包,應用程式需要選擇合适的封包大小。封包過長時,向下交給IP層後,IP層在傳送時需要進行分片,降低IP層的效率。封包過短,UDP将它交給IP層後,IP資料報的首部相對長度太大,也會降低IP層效率。
  • UDP沒有擁塞控制,是以網絡出現的擁塞不會使源主機的發送效率降低。
  • UDP支援一對一、一對多、多對一、多對多的互動通信。即單點傳播、多點傳播、廣播。
  • UDP首部開銷小,隻有8個位元組,比TCP的20個位元組的首部要短。

TCP:

  • TCP是面向連接配接的運輸層協定,即應用程式在使用TCP協定前需要先建立TCP連接配接,傳送完資料後需要釋放已經建立的連接配接。
  • 每一條TCP連接配接隻能有2個端點,即每一條TCP連接配接隻能是點對點。
  • TCP提供可靠傳遞的服務。通過TCP連接配接傳送的資料,無差錯、不丢失、不重複、并且按序到達。
  • TCP提供全雙工通信。允許通信雙方的應用程序在任何時候都可以發送資料。TCP連接配接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的資料。
  • 面向位元組流。流入到程序或從程序流出的位元組序列。

參考

計算機網絡(第六版)

繼續閱讀