tcp協議全稱: 傳輸控制協議, 顧名思義, 就是要對資料的傳輸進行一定的控制
tcp協議的特點:
(1)相對於傳輸層的udp協議,tcp協議的特點是面向連線的、可靠的傳輸和位元組流。
(2)使用tcp協議通訊的雙方必須首先建立連線,然後才能開始資料的讀寫。雙方都必須為該連線分配必要的核心資源,以管理連線的狀態和連線上的資料傳輸。tcp是全雙工通訊,即雙方的資料讀寫可以通過乙個連線進行。完成資料交換後,通訊雙方必須斷開連線以釋放系統資源。
(3)tcp是端對端的,所以基於廣播和多播的應用程式不能使用tcp服務,而無連線的udp協議則非常適合於廣播和多播。
tcp客戶端
from socket import *
# 1、建立套接字
tcp_socket = socket.socket(af_inet,sock_stream)
# 2、獲取ip和port
user_ip = input('請輸入ip:')
user_port = int(input('請輸入埠:'))
# 3、連線伺服器
tcp_socket.connect(user_ip,user_port)
# 4、提示使用者傳送資料
send_data = input('請輸入傳送的資料:')
tcp_socket.send(send_data.encode('utf-8'))
# 5、接收對方發來的資料
recv_data = tcp_socket.recv(1024)
print('接收到的資料為:',recv_data.decode('utf-8'))
# 關閉套接字
tcp_socket.close()
tcp服務端
tcp伺服器端建立流程如下:
1,socket建立乙個套接字
2,bind繫結ip和port
3,listen使套接字變為可以被動鏈結
4,accept等待客戶端的鏈結
5,recv/send接收/傳送資料
from socket import *
# 1、建立套接字
tcp_socket = socket.socket(af_inet,sock_stream)
# 2、繫結ip和port
tcp_socket.bind = (('',7788))
# 3、listen 使套接字變為被動套接字
tcp_socket.listen(128)
# 4、accept 建立連線
client_socket,client_socket = tcp_socket.accept()
#5 接收和傳送資料
recv_data = client_socket.recv(1024)
print('接收到的資料為:',recv_data.decode('utf-8'))
client_socket.send('調查的城市'.encode('utf-8'))
# 6、關閉客戶端
client_socket.close()
tcp協議的三次握手
tcp協議的四次揮手
x,,y都表示32位的隨機數
syn標誌:表示發起連線請求
ack標誌:表示應答請求
seq傳送方的順序編號
ack應答方的應答編號=上一次seq編號+這次傳送資料長度len
注意:資料長度len,在三次握手和四次揮手的過程中都為0,只在資料傳輸的時候,有實際的長度
在資料傳輸的時候,加以說明:
客戶端傳送syn seq=x+1,假設資料長度len=10
伺服器應答ack ack=x+1+10
如果客戶端再傳送請求,那麼就重複以上的兩步syn和ack
fin表示斷開連線請求
fin和syn都會占用乙個序列長度
問題一:為什麼握手三次,而揮手四次?
原因就是三次握手的時候,在沒有真正建立連線(三次握手結束)之前是不能傳送應用資料的,伺服器返回的時候,應答包和請求包是乙個包。
而四次揮手是:當乙個客戶端主動傳送斷開close()請求時,伺服器端卻可以接收別的請求;要想真正的結束,那麼伺服器端就需要被動的呼叫斷開close()。那麼伺服器返回的時候,ack(應答包)和fin(斷開連線包)是不同的兩個包。所以,需要四次揮手。
問題二:握手為什麼是三次?兩次行不行?為什麼?
三次握手是為了安全,正確考慮,防止大部分的惡意攻擊請求。
兩次握手不行,因為如果有惡意的、不停的發請求,那麼伺服器每一次就認為是正確的請求;這樣,由於伺服器連線的請求數是一定的,那麼這些惡意的請求會一直佔伺服器,會導致正常的使用者連線不上伺服器,長時間伺服器就癱瘓了。
網路通訊2 TCP的函式
1.inet addr 函式 函式作用 十進位制轉換成二進位制 函式原型 int inet addr const char strptr 2.inet pton函式 函式原型 int inet pton int family,const char src,void dst 引數 family af ...
實用TCP協議(2) TCP 引數優化
在了解 tcp 的基本機制後本文繼續介紹 linux 核心提供的鏈結佇列 tw reuse so reuseport syn cookies 等機制以優化生產環境中遇到的效能問題。linux 核心會維護兩個佇列 佇列滿後伺服器會丟棄溢位的連線會導致的情況 全連線佇列溢位時伺服器根據 net.ipv4...
python網路程式設計 TCP網路程式設計
tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...