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連接配接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的資料。
- 面向位元組流。流入到程序或從程序流出的位元組序列。
參考
計算機網絡(第六版)