TCP的介紹
TCP也叫傳輸控制協議(Transmission Control Protocol)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由IETF的RFC 793定義。
1、TCP 中常說的握手指的是:連接的定義和連接的建立的過程。IP 協議是無連接的,但是 TCP 是有鏈接的。
2、端口:數據鏈路層依靠 mac 地址尋址,網絡接口層依靠 ip 地址尋址,傳輸層依靠端口號尋址,端口就是應用層的各種協議進程和傳輸實體之間進行層間交換的地址。
3、端口號:標識不同進程的號碼,16位,2的16次方個,只在本地有意義。一共有三類,一是保留端口,比如 ftp 是21,20,dns 是53,http 是80端口,smtp 是25等。二是登記端口,三是客戶端端口號,也叫臨時端口(前兩者叫服務端端口)
4、套接字:主機 ip+端口號組成,只有通過 ip 地址和端口號,才唯一確定一個連接的端口。唯一的標識了網絡裏的某臺主機中的某個應用進程。
5、tcp就是傳輸控制協議,實現的是面向連接的服務,向上提供了一條全雙工的可靠的邏輯信道,可靠交付,開銷大,注意,tcp 的連接通道是邏輯 上的,對路由器不可見,類似虛電路。
tcp 連接的三段:
建立,傳送,釋放。連接的端點叫 socket(套接字),被唯一的通信兩端點確定,採用的是 cs 架構(客戶服務器模型),tcp 傳輸連接的建立採用的是三次握手(可以防止報文段在傳輸過連接建立中出錯)
tcp三次握手的最主要目的是保證連接是雙工的,可靠更多的是通過重傳機制來保證的。
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器 進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED狀態,完成三次握手。
通過這樣的三次握手,客戶端與服務端建立起可靠的雙工的連接,開始傳送數據。
爲了保證服務端能收接受到客戶端的信息並能做出正確的應答而進行前兩次(第一次和第二次)握手,爲了保證客戶端能夠接收到服務端的信息並能做出正確的應答而進行後兩次(第二次和第三次)握手。
UDP介紹
用戶數據報協議,實現的是無連接服務,無確認,不可靠的交付,開銷小,時延短,沒有擁塞控制,主要應用於實時應用,比如 ip 電話,qq,視頻會議等。udp 數據報僅僅是 ip 數據報的一部分。
TCP與UDP區別總結:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
TCP的特點
1、面向連接
✦ TCP通信需要經過創建連接、數據傳送、終止連接三個步驟。
✦ 在通信開始之前,先建立相關的鏈接,才能發送數據,類似於生活中,"打電話"。
✦ 完成數據交換後,雙方必須斷開此連接,以釋放系統資源。
✦ 這種連接是一對一的,因此TCP不適用於廣播的應用程序,基於廣播的應用程序請使用UDP協議。
2、可靠傳輸
✦ TCP發送的每個報文段都必須得到接收方的應答才認爲這個TCP報文段傳輸成功
✦ 發送端發出一個報文段之後就啓動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。
✦ TCP爲了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。
✦ TCP用一個校驗和函數來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和。
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每臺設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬件資源。 而且,因爲TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等。
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被者利用的漏洞就要少一些。但UDP也是無法避免的,比如:UDP Flood***……
UDP的缺點: 不可靠,不穩定 因爲UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網絡質量不好,就會很容易丟包。 基於上面的優缺點,那麼: 什麼時候應該使用TCP: 當對網絡通訊質量有要求的時候,比如:整個數據要準確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。
常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸
UDP: 當對網絡通訊質量要求不高的時候,要求網絡通訊速度能儘量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP
TCP通信模型
TCP通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似於生活中,"打電話"
OSI 計算機網絡7層模型
TCP/IP四層網絡模型
TCP客戶端構建流程
比如一個人想打10086求助人工服務。 tcp的客戶端要比服務器端簡單很多,客戶端只需要找一個電話亭,拿起電話撥打即可。
示例代碼:
1from socket import *
2
3# 創建socket
4tcp_client_socket = socket(AF_INET, SOCK_STREAM)
5
6# 目的信息
7server_ip = input("請輸入服務器ip:")
8server_port = int(input("請輸入服務器port:"))
9
10# 鏈接服務器
11tcp_client_socket.connect((server_ip, server_port))
12
13# 提示用戶輸入數據
14send_data = input("請輸入要發送的數據:")
15
16tcp_client_socket.send(send_data.encode("gbk"))
17
18# 接收對方發送過來的數據,最大接收1024個字節
19recvData = tcp_client_socket.recv(1024)
20print('接收到的數據爲:', recvData.decode('gbk'))
21
22# 關閉套接字
23tcp_client_socket.close()
TCP服務端構建流程
在程序中,要完成一個tcp服務器的功能,需要的流程如下:
socket創建一個套接字;
bind綁定ip和port;
listen使套接字變爲可以被動套接字;
accept取出一個客戶端連接 用以服務;
recv/send接收發送數據;
示例代碼
1from socket import *
2
3# 創建socket
4tcp_server_socket = socket(AF_INET, SOCK_STREAM)
5
6# 本地信息
7address = ('', 7788)
8
9# 綁定
10tcp_server_socket.bind(address)
11
12# 使用socket創建的套接字
13tcp_server_socket.listen(128)
14
15# 如果有新的客戶端來鏈接服務器,那麼就產生一個新的套接字專門爲這個客戶端服務
16client_socket, clientAddr = tcp_server_socket.accept()
17
18# 接收對方發送過來的數據
19recv_data = client_socket.recv(1024)
20print('接收到的數據爲:', recv_data.decode('gbk'))
21
22# 發送一些數據到客戶端
23client_socket.send("thank you !".encode('gbk'))
24
25# 關閉爲這個客戶端服務的套接字
26client_socket.close()
TCP的3次握手
SYN
請求建立連接字段:1表示與對方要進行網絡連接建立 ,0 表示默認沒有連接建立請求。
ACK
確認控制字段:1表示上一次發送的數據對方接收了,0 表示沒有接收到上次發送的數據信息。
seq
隨機序列號。
TCP的4次揮手
FIN
請求斷開連接字段:1表示與對方斷開網絡連接,0 表示默認沒有斷開連接請求。
ack
隨機序號回覆(ack=seq+1)。
ctl
控制字段號。
TCP的11種狀態集
tcp/ip協議簇
爲了把全世界的所有不同類型的計算機都連接起來,就必須規定一套全球通用的協議,爲了實現互聯網這個目標,互聯網協議族(Internet Protocol Suite)就是通用協議標準。
互聯網協議包含了上百種,最重要的是TCP和IP協議,所以,互聯網的協議簡稱TCP/IP協議(族)
TCP/IP協議傳輸示意圖