tcp協議,傳輸控制協議(英語:transmission control protocol,縮寫為 tcp)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由ietf的rfc 793定義。通訊雙方必須先建立連線才能進行資料的傳輸,雙方都必須為該連線分配必要的系統核心資源,以管理連線的狀態和連線上的傳輸。tcp通訊需要經過建立連線、資料傳送、終止連線三個步驟。
tcp通訊模型中,在通訊開始之前,一定要先建立相關的鏈結,才能傳送資料,類似於生活中,「打**」"
雙方間的資料傳輸都可以通過這乙個連線進行。
完成資料交換後,雙方必須斷開此連線,以釋放系統資源。
這種連線是一對一的,因此tcp不適用於廣播的應用程式,基於廣播的應用程式請使用udp協議。
1)tcp採用傳送應答機制
tcp傳送的每個報文段都必須得到接收方的應答才認為這個tcp報文段傳輸成功
2)超時重傳
傳送端發出乙個報文段之後就啟動定時器,如果在定時時間內沒有收到應答就重新傳送這個報文段。
tcp為了保證不發生丟包,就給每個包乙個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回乙個相應的確認(ack);如果傳送端實體在合理的往返時延(rtt)內未收到確認,那麼對應的資料報就被假設為已丟失將會被進行重傳。
3)錯誤校驗
tcp用乙個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算校驗和。
4) 流量控制和阻塞管理
流量控制用來避免主機傳送得過快而使接收方來不及完全收下。
udp通訊模型中,在通訊開始之前,不需要建立相關的鏈結,只需要傳送資料即可,類似於生活中「寫信」
udp通訊模型中,在通訊開始之前,一定要先建立相關的鏈結,才能傳送資料,類似於生活中,「打**」"
tcp客戶端,並不是像之前乙個段子:乙個顧客去飯館吃飯,這個顧客要點菜,就問服務員咱們飯店有客戶端麼,然後這個服務員非常客氣的說道:先生 我們飯店不用客戶端,我們直接送到您的餐桌上如果,不學習網路的知識是不是 說不定也會發生那樣的笑話
所謂的服務端:就是提供服務的一方,而客戶端,就是需要被服務的一方
tcp的客戶端要比伺服器端簡單很多,如果說伺服器端是需要自己買手機、查手機卡、設定鈴聲、等待別人打**流程的話,那麼客戶端就只需要找乙個**亭,拿起**撥打即可,流程要少很多
import socket
defmain()
:# 1.建立乙個tcp套接字
tcp_socket = socket.socket(
)# 2.鏈結伺服器
server_ip =
input
("請輸入要鏈結的伺服器的ip"
) server_port =
int(
input
("請輸入要鏈結的伺服器port"))
server_addr =
(server_ip, server_port)
# 3.傳送資料/接受資料
send_data =
input
("請輸入要傳送的資料"
) tcp_socket.send(send_data.encode(
"utf-8"))
# 4.關閉套接字
tcp_socket.close(
)if __name__ ==
"__main__"
: main(
)
<1>tcp客戶端
請輸入伺服器ip:10.10.0.47<2>網路除錯助手:請輸入伺服器port:8080
請輸入要傳送的資料:你好啊
接收到的資料為: 我很好,你呢
如果想讓別人能更夠打通咱們的**獲取相應服務的話,需要做以下幾件事情:
如同上面的**機過程一樣,在程式中,如果想要完成乙個tcp伺服器的功能,需要的流程如下:
import socket
# 1.socket建立乙個套接字
# 2.bind繫結ip和port
# 3.listen使套接字可以被動鏈結
# 4.accept等待客戶端的鏈結
# 5.recv/send接收傳送資料
defmain()
:# 1.買個手機(socket建立乙個套接字)
tcp_server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 2.插入手機卡(繫結本地資訊,bind)
tcp_server_socket.bind((""
,7890))
# 3.將手機設定為正常的響鈴模式(讓預設的套接字由主動變為被動 listen)
tcp_server_socket.listen(
128)
print
("-----1-----"
)# 4.等待別人的**來(等待客戶端的鏈結 accept)
new_client_socket, client_addr = tcp_server_socket.accept(
)print
("------2------"
)print
(client_addr)
# ip
# 接收客服端傳送過來的請求
recv_data = new_client_socket.recv(
1024
)print
(recv_data)
# 回送一部分資料給客戶端
new_client_socket.send(
"dsdsdas-----ok-----"
.encode(
"utf-8"))
# 關閉套接字
網路程式設計之TCP協議整理
建立連線,形成傳輸資料的通道,在連線中進行大資料量的傳輸。需要通過三次握手完成連線,是可靠地協議。但是效率低。客戶端建立過程。1 建立tcp客戶端socket伺服器,使用的是socket物件,建立物件時明確目的地,以及要連線的主機。2 如果連線成功,說明資料傳輸通道已經建立。這個通道就是流,sock...
QT基於tcp協議網路程式設計
基於qt網路程式設計 基於tcp協議 c s模式程式設計 所需要的類 qtcpserver qtcpsocket 利用qt基於tcp協議編寫c s模式程式 兩個類中的訊號 qtcpserver newconnection qtcpsocket readyread connected disconne...
網路程式設計筆記 TCP協議總結
tcp協議是傳輸層中的一種面向連線的,提供可靠服務的傳輸協議,是基於位元組流傳輸的。與udp相比,它會在通訊的雙方通過建立一些資料結構來保證連線的建立。特點如下 後文,再詳細說明tcp協議如何實現這些特點。視窗大小 用作流量控制,標識自己當前能否處理的能力 如果客戶端a和伺服器b想要通過tcp協議進...