1. 程式人生 > >tcp 與udp 的區別

tcp 與udp 的區別

1.TCP和UDP對比

TCP(Transmission Control Protocol)可靠的、面向連線的協議(eg:打電話)、傳輸效率低全雙工通訊(傳送快取&接收快取)、面向位元組流。使用TCP的應用:Web瀏覽器;檔案傳輸程式。

UDP(User Datagram Protocol)不可靠的、無連線的服務,傳輸效率高(傳送前時延小),一對一、一對多、多對一、多對多、面向報文(資料包),盡最大努力服務,無擁塞控制。使用UDP的應用:域名系統 (DNS);視訊流;IP語音(VoIP)。

TCP和UDP下socket差異對比圖:

2.TCP詳解

服務端示例

 1
import socket 2 sk = socket.socket() 3 sk.bind(('127.0.0.1',8898)) #把地址繫結到套接字 4 sk.listen() #監聽連結 5 conn,addr = sk.accept() #接受客戶端連結 6 ret = conn.recv(1024) #接收客戶端資訊 7 print(ret) #列印客戶端資訊 8 conn.send(b'hi') #向客戶端傳送資訊 9 conn.close() #關閉客戶端套接字 10 sk.close() #關閉伺服器套接字

客戶端示例

import socket
sk = socket.socket()           # 建立客戶套接字
sk.connect(('127.0.0.1',8898))    # 嘗試連線伺服器
sk.send(b'hello!')
ret = sk.recv(1024)         # 對話(傳送/接收)
print(ret)
sk.close()            # 關閉客戶套接字

TCP三次握手流程:

一次揮手:客戶端傳送連線請求報文SYN = 1 ,seq=x

二次揮手:服務端傳送確認報文,同時請求連線客戶端 SYN =1, ACK = 1, ack = x+1, seq = y

三次揮手:客戶端傳送確認報文: ACK = 1,ack = y+1, seq = x+1,連線建立成功

 

TCP斷開連線的四次揮手

一次揮手: 客戶端向伺服器傳送連線釋放報文,並且停止傳送資料

二次揮手: 伺服器發出確認報文,同意連線釋放

客戶端等待伺服器發出連線釋放報文

三次揮手:伺服器向客戶端傳送連線釋放報文,並且停止傳送資料

四次揮手: 客戶端發出確認報文, SYN = 1,同時開啟   時間等待計時器,等待2倍最長報文段壽命,

    若服務端沒接收到客戶端發回的報文,則服務端率先進入closed狀態,若服務端沒有接收到客戶端發來的確認報文,

    ,則一段時間後服務端會超時重發(即重新進行步驟3和4)

 

 

 為什麼建立連線需要3次握手

3 udp例項

服務端示例

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #建立一個伺服器的套接字
udp_sk.bind(('127.0.0.1',9000))        #繫結伺服器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr)                 # 對話(接收與傳送)
udp_sk.close()                         # 關閉伺服器套接字

客戶端示例

import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)