基於UDP TCP協議下的socket套接字

2021-10-08 06:43:15 字數 4563 閱讀 7389

本篇文章我主要想用來介紹關於udp、tcp協議的基本知識及兩個的優缺點、基於這兩種協議下的套接字的基本用法,以及最重要的個人理解。

udp協議:是user datagram protocol即使用者資料報協議的一種簡稱,是osi參考模型中的一種無連線傳輸協議,其提供面向事物的不可靠資訊傳輸服務。在網路中與tcp協議一樣是用來處理資料報的,但是udp有不提供資料報分組、組裝和不能對資料報進行排序,即不保證資料的完整準確的傳輸。

tcp協議:是transmission control protocol即傳輸控制協議的一種簡稱,是一種面向連線的、可靠的、基於位元組流的運輸層的通訊協議。

接下來我們主要介紹兩者的區別及其優缺點:

1、tcp為面向連線的(如打**需要先通過撥號建立連線),udp是無連線的(如寫信,只需知道對方位址即可把信傳送出去。)

2、tcp提供可靠的服務(即通過tcp連線傳送的資料,無差錯、不丟失、不重複,且按序到達,如打**能保證對方能夠完整的得到自己的訊息;)udp則是盡最大的努力交付,不保證可靠交付。(如寫信,我只管將芯傳送出去,但是不能保證對方一定能收到,也無法保證信件在傳輸的過程中不被損壞或者串改等。)   

(1)tcp採用傳送應答機制

tcp傳送的每個報文段必須等到對方確認收到才會認為這段報文傳送成功。

(2)超時重傳

傳送端發出乙個報文段之後就啟動定時器,如果在定時時間內沒有收到應答就重新傳送這個報文段。

tcp為了保證不發生丟包,就給每個包乙個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回乙個相應的確認(ack);如果傳送端實體在合理的往返時延(rtt)內未收到確認,那麼對應的資料報就被假設為已丟失將會被進行重傳。

(3)錯誤校驗

tcp用乙個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算校驗和。來保證資料的準確、不丟包。

(4)流量控制和阻塞管理

流量控制用來避免主機傳送得過快而使接收方來不及完全收下。即接收方緩衝區每接收乙個包就會給傳送方傳送乙個提示,我這邊緩衝區還能傳送多少,用來提示傳送方式是否繼續傳送。

3、udp具有較好的實時性,工作效率比tcp高,適用於對高速傳輸和實時性有較高的通訊或者廣播通訊。

4、每一條tcp連線只能是點對點的 ;而udp支援一對多,多對一和多對多的互動通訊。(就類似於**(tcp)和廣播(udp)。)

5、tcp對系統資源的要求較多,而udp對系統資源要求較少。

由於在隨筆中會介紹套接字,這裡便不再複述,主要講述一下基於udp協議下的套接字的用法及其基本步驟,我們直接從例項中來介紹:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import socket

#1.建立套接字物件

udp_socket = socket.socket(socket.af_inet,socket.sock_dgram)

#2.繫結本地資訊

udp_socket.bind(("",8080))

#3.傳送資訊/接收資訊

# a.傳送

send_data = input("enter messgae--->:") #鍵入輸出內容

desk_addr = ("192.168.11.18",7878) #確定目標ip和埠

udp_socket.sendto(send_data.encode("utf-8"),desk_addr)

# b.接收

recv_data = udp_socket.recvfrom(1024)

recv_content =recv_data[0].decode("uft-8")

recv_addr = recv_data[1]

print("%s send : %s "%(recv_addr,recv_content))

# 4.關閉套接字

udp_socket.close()

解析案例:其實我們可以將udp協議下的套接字實現通訊可以看做寫信,也可以看做廣播找人。

1、建立套接字 --》 就類似檔案處理的open函式,需要建立檔案物件對檔案進行讀寫操作操作,而socket套接字也是同樣的道理,只不過socket套接字是對網路上資料進行讀(接收資訊)、寫(傳送資訊)操作而已。同時需要注意的是引數:af_inet是指伺服器之間的網路通訊,sock_dgram是指基於udp協議的資料報式的socket套接字。

2、繫結本地資訊 --》這一步主要針對資訊的接收,就型別於寫信要想別人給你回信那麼你肯定要告訴別人位址,而其中的ip位址為"",即表示我這台主機上所有的ip收到的資訊均可以被該埠進行接收。

3、傳送資訊 --》  就類似於寫信,你需要知道對方的位址以及你的寫信內容才能發出。注:資料在網路上的傳輸和硬碟等的儲存均是以位元組的格式即二進位制的格式進行儲存的,故在資料傳送前需對其進行編碼。

接收資訊 --》 接收的資料是乙個元組,元組的第乙個元素為資訊內容,第二個元素為元組,其中包含對方的ip位址和埠號。

4、關閉套接字  --》就像我進行完寫信和收信的過程,我就不需要一直待在郵局。

基於tcp協議的套接字,通常用於c/s架構即客戶端/服務端之間的通訊,接下來我們看一下基於tcp協議下socket套接字實現通訊資料傳輸的基本流程, 還是看案例吧:

實現客戶端的基本流程:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

#---------------------------客戶端------------------------------

import socket

# 1、建立套接字物件

client_socket = socket.socket(socket.af_inet,socket.sock_stream)

# 2、與服務端建立連線

client_socket.connect(("192.168.11.12",7878))

# 3、傳送訊息,接收訊息

send_msg = input("enter message -->:")

client_socket.send(send_msg.encode("utf-8"))

recv_msg = client_socket.recv(1024)

print(recv_msg.decode("uft-8"))

# 4、關閉套接字

client_socket.close()

1、建立套接字物件 :擁有乙個可以打**的手機,用來進行通訊或者進行資料傳輸等,需要注意的是其引數為:af_inet即使用ipv4進行伺服器之間的網路通訊,sock_strea即擁有tcp協議的流式socket套接字。

3、傳送訊息、接收訊息:**撥通了進行通話,但這與寫信不同,我已經知道撥通了對方的**,當然不需要再次輸入對方的**號碼了,也不需要在每次聽到對方說話時,都要對方附帶一句:我是誰我在哪?。即傳送資訊和接收資訊,都不會再涉及對方的ip位址和埠等問題。

4、關閉套接字 ;掛**。

實現服務端的基本流程:

# ---------------------------服務端-----------------------------

import socket

# 1.建立監聽套接字

server_socket = socket.socket(socket.af_inet,socket.sock_stream)

# 2、繫結本地資訊

server_socket.bind(("",7878))

# 3、監聽

server_socket.listen(128)

sc_socket,client_addr =server_socket.accept()

# 5、接收資訊和傳送資訊

recv_meg =sc_socket.recv(1024)

print(recv_meg.decode("gbk"))

send_msg =input("server:enter message-->:")

sc_socket.send(send_msg.encode("utf-8"))

# 6、關閉服務套接字

sc_socket.close()

# 7、關閉監聽套接字

server_socket.close()

解析:基於tcp協議的socket套接字進行通訊的服務端實現的流程類似於 :10086的主機服務:

1、建立套接字 :10086的主機開機,注:通常而言在c/s架構中,伺服器肯定是先工作的。

4、接受客戶鏈結,獲取客戶位址並且建立服務套接字  :即10086的主機接到來電就安排10086的客戶小姐為客戶進行通訊服務,同時也會在來電顯示上獲得客戶端的**資訊;即當客戶端鏈結服務端時,服務端在獲取客戶端的資訊時,也會建立套接字物件為該客戶端進行服務,同時在客戶端斷開鏈結時,該服務套接字將會釋放可能去服務下乙個鏈結進來的客戶端。

5、接收資訊和傳送資訊:在接到客戶的來電,10086安排的客服小姐會一直為你服務,直到通話結束。

6、關閉服務套接字 : 10086的客服掛**。

7、關閉監聽套接字 :10086主機關閉,全體下班。

綜上所述:就是基於udp、tcp協議下套接字的實現,當然只是介紹了兩種型別套接字的基本實現流程以及自己的一些理解。

基於Select模型的UDP TCP混合程式設計

selecttestserver.cpp 定義控制台應用程式的入口點。tcp udp復用server select非阻塞模式 ip 127.0.0.1 tcp port 5001 udp port 5000 include stdafx.h include pragma comment lib,ws...

基於平台的SoC設計問題

基於平台的soc設計問題 基於平台的方法可提供一種完全整合的通用架構,設計師能夠利用這些共同特點,簡單 快速地開發出soc。而且,通過採用事先設計和特性確定的元件而不是定製設計的方法,有利於加速開發團隊的設計流程,減少逐漸增加的上市時間壓力。把它們應用於多個soc專案,重複使用現有的智財權 ip 模...

Linux的傳輸層協議(UDP,TCP)例項講解

傳輸層 負責資料能夠從傳送端傳輸接收端 埠號埠號標識了乙個主機上進行通訊的不同的應用程式 在tcp ip協議中,用 源ip 源埠號 目標ip 目標埠號 協議號 這樣乙個五元組來表示乙個通訊 可以通過netstat n檢視 cat etc services 檢視知名埠號,我們在寫乙個程式使用埠號時,要...