在傳輸層有兩個協議:
TCP協議:需要將要傳輸的文件分段傳輸,建立會話,可靠傳輸,需要流量控制(大型文件傳輸,視頻傳輸)
UDP協議:一個數據包就能完成數據通信,不用分段,不需要建立會話,不可靠傳輸,不需要控制流量(QQ聊天,屏幕廣播,多播)
傳輸層協議和應用層協議之間的關係
端口是什麼
由上圖可以看出,一個TCP報文格式有TCP首部和數據部分組成,在TCP首部有兩種端口,源端口爲發送請求計算機的端口號,目的端口爲偵聽計算機的對應服務端口號,在目的計算機當中有不同的服務,當我們需要不同服務時,我們可以發送不同請求,在目的主機中通過端口區分不同服務。
例如:我們要訪問web站點,我們需要發送的TCP報文格式爲
我們要使用ftp站點,我們需要發送的TCP報文格式爲
端口範圍 0 ~ 65535
熟知端口:數值一般爲0 ~ 1023
常見的應用層協議使用的端口
- http = TCP+80
- https = TCP+443
- RDP = TCP+3389
- ftp = TCP+21
- 共享文件夾 = TCP+445
- SMTP = TCP+25
- POP3 = TCP+110
- telnet = TCP+23
- SQL = TCP+1433
- DNS = UDP+53
登記端口號:數值爲1024 ~ 49151
客戶端口號:數值爲49152 ~ 65535
服務和應用層協議之間的關係
- 服務使用TCP或者UDP的端口偵聽客戶端請求
- 客戶端使用IP地址定位服務器,使用目標端口定位服務
- 可以在服務器網卡上設置只開放必要的端口,實現服務器網絡安全
如何查看服務偵聽的端口
在命令窗口:
- netstat -an
- netstat -n 查看建立的會話
- netstat -nb 查看建立會話的進程
- telnet 192.168.xxx.xxx xxxx測試遠程計算機某個端口是否打開
UDP的主要特點
- UDP是無連接的,即發送數據之前不需要建立連接
- UDP使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制
- UDP是面向報文的。UDP沒有擁塞控制,很適合多媒體通信的要求
- UDP支持一對一、一對多、多對一和多對多的交互通信
- UDP的首部開銷小,只有8個字節
TCP傳輸控制協議
- TCP是面向連接的傳輸層協議(三次握手,建立連接)
- 每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點(一對一)
- TCP提供可靠交付的服務
- TCP提供全雙工通信(發送方發送的同時,接收方也要給發送方反饋)
- 面向字節流
TCP的連接
每一條TCP連接有兩個端點。TCP連接的端點不是主機,不是主機的IP地址,不是應用進程,也不是傳輸層的協議端口號。TCP連接的端點叫作套接字(Socket)。端口號拼接IP地址即構成了套接字。
套接字Socket = (IP地址:端口號)
TCP連接 = {socket1,socket2} = {(IP1:port1),(IP2:port2)}
可靠通信實現
TCP協議提供了確認和重傳機制,我們可以在不可靠的傳輸網絡上實現可靠的通信。這種可靠的傳輸協議稱爲自動重傳請求ARQ(Automatic Repeat reQuest)。ARQ表明重傳的請求是自動進行的。接收方不需要請求發送方重傳某個出錯的分組。
流水線傳輸
發送方可連續發送多個分組,不必每發完一個分組就停頓下來等待對方的確認。由於信道上一直有數據不間斷的傳送,這種傳輸方式可獲得很高的信道利用率。(通信,上網,聊天,下載等)
連續ARQ協議(窗口式發送),累計確認
TCP傳輸連接管理
傳輸連接有三個階段:連接建立、數據傳輸、連接釋放
TCP連接的建立都是採用客戶服務器方式。主動發起連接建立的應用進程叫作客戶,被動等待連接建立的應用進程叫作服務器。
三次握手建立TCP連接
- 客戶端首先發送一個同步數據包SYN = 1(同步標記位),ACK = 0(確認標記位)seq = x(序號,x值由客戶端指定),服務器收到這樣的數據包就能知道這是一個主動發起建立連接的數據包。
- 服務器收到這樣的數據包之後會發送一個迴應的數據包SYN = 1,ACK = 1,seq = y(序號,y值由服務器端指定),ack = x+1(這裏的確認號等於先前客戶端x+1)。
- 客戶端收到確認數據包之後,客戶端再發送給服務器端一個數據包ACK = 1,seq = x+1,ack = y+1,這裏不包含同步標記SYN
如果網絡通暢,按道理來說第二次服務器端的迴應數據包發送給客戶端之後就算建立了連接,爲什麼還要進行第三次確認呢?首先客戶端向服務器端發送一個建立連接的請求,以及服務器端向客戶端確認這個請求,這兩個數據包足以確定這個網絡是暢通的,並且這兩個數據包足以能夠協商數據通信所需要的參數。 之所以要進行第三次確認是考慮到了通信線路和服務器資源的問題,如果剛開始客戶端發送一個建立連接請求之後,由於線路的問題,服務器端沒有收到,因此在規定的時間內客戶端沒有等到服務器端的迴應,那麼客戶端會再發一個建立連接的請求,由於這次線路選擇的好,服務器端收到了請求並且發送給了客戶端迴應數據包,就在這時,之前客戶端發送的請求被服務器端收到了。由於現在客戶端和服務器端已經建立了連接,這時服務器端把之前的請求迴應發給客戶端之後,此時的客戶端是不認這個迴應數據包的。而服務器端認爲這個連接已經建立了,在等待客戶端發送確認(這裏就造成了服務器端的資源浪費),等了一段時間後沒有等到確認,那麼服務器就釋放了。現在已經確認了的客戶端再發送一個確認數據包給服務器端,服務器端收到後彼此之間就建立了完整的連接,之後的數據包就是數據傳輸了。
三次握手建立TCP連接的各狀態
TCP的連接釋放
TCP的連接釋放各狀態
注意這裏的等待時間,最後服務器發送了確認關閉後,客戶端需要等待一段時間,而不是立馬關閉。如果客戶端發送給服務端的確認關閉數據包丟失了,此時服務器端會再次發送確認關閉數據包,如果此時的客戶端已經關閉了,那麼服務器端就永遠關不掉了,因此客戶端收到了服務器端的確認關閉數據包之後需要等待一段時間,是爲了響應再給服務器端一個確認關閉。