網絡概念
- MAC地址(硬件地址)
- 網絡IP地址(如192.168.1.101)
- 網絡端口(實現多路通信,用來給不同應用程序來區分使用,范圍0~65535,比如瀏覽網頁服務(80端口), FTP服務(21端口) )
交換機和路由器
- 路由器在網絡層,路由器可以處理TCP/IP協議,交換機不可以.
- 交換機在中繼層。路由器根據IP地址尋址,交換機根據MAC地址尋址。
- 路由器提供防火牆的服務,具有虛擬撥號上網功能,交換機不具備這些功能。
交換機
端到端轉發,基於MAC地址實現不同設備間的數據轉發,轉發速度快.
路由器
根據實際數據路線轉發,基於網絡IP地址實現不同網絡間的數據轉發
靜態路由
指網絡管理員配置好的轉發路徑,能夠直接確定數據路線轉發,大型和復雜的網絡環境通常不宜采用靜態路由,當連線一改變,則靜態路由需要重新配置
動態路由
路由器根據算法自動地建立自己的路由表實現數據轉發,由於需要路由器之間頻繁地交換各自的路由表,從而安全保密性低.
網絡協議
為數據交換而建立的規則、標准或約定的集合
協議棧
如上圖所示,可以看到應用層的FTP協議是基於傳輸層的TCP協議來實現文件共享傳輸.而傳輸層的TCP協議則基於網絡層的IP實現的
默認情況下FTP協議使用TCP端口中的 20和21這兩個端口,其中20用於傳輸數據,21用於傳輸控制信息
TCP和UDP
TCP(傳輸控制協議)
面向連接的協議, 主要用於大量數據的場合,比如文件傳輸,一個TCP連接必須要經過3次握手才能建立
- 客戶端向服務器請求發送信號
- 服務器接收到后,向客戶端發送回應信號,並提供seq序列號(表示每個數據包的編號,因為數據是被拆成多個數據包發送的).告訴客戶端,你下個數據包序號從指定值開始
- 客戶端再次發出ACK確定服務器的發送ACK請求同步要求
然后握手完成后,便開始進行數據傳輸了.
為什么要第3次握手,而不是2次握手?
避免重復連接請求,如果第一次連接請求超時了, 這時客戶端假如重發請求,而第一次連接請求最終還是發送到服務器了,則服務器將再次重復接受到該請求,由於服務器之前已經確定過了第3次確定請求,所以服務器可以直接拋棄不管了(假如沒有第3次確認,則服務器無法避免重連)
一個TCP斷連則需要4次揮手才能斷開
1.客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送
2.服務器收到這個FIN,它發回一個ACK,確認序號為收到的seq序號加1。
3.服務器關閉與客戶端的連接,發送一個FIN給客戶端A
4.客戶端發回ACK報文確認,並將確認序號設置為收到序號加1
UDP(用戶數據報協議)
無連接的協議, 主要用於不要求分組順序到達、少量數據的傳輸場合, 數據傳輸效率高.缺點容易掉包.
QT網絡編程
Qt Network模塊提供的類允許編寫 TCP/IP clients 和 servers、以及FTP和HTTP等常用協議(后續章節講解FTP和HTTP)
而QTcpSocket和QTcpServer類則是實現TCP客戶端和服務器用的.
QTcpSocket
在網絡編程中, QTcpSocket支持以下兩種訪問方式
1)異步(非阻塞)訪問
異步方式通過QTcpSocket的信號與槽實現,比如當我們調用connectToHost()連接服務器時,此時並非立即連接成功,所以我們需要等待connected()信號觸發后,才知道連接成功,當然也可以通過信號error()來處理與服務器的連接發生錯誤的異常事件.
2) 同步(阻塞)訪問
通過waitForXxxx()函數實現阻塞,最好使用多線程實現,否則的話,會導致界面也會進入阻塞.
QTcpSocket同步連接服務器步驟如下:
socket->connectToHost("192.168.1.101", 8088); //連接服務器 if (socket->waitForConnected(1000)) //阻塞等待1000ms qDebug("Connected!"); else return false; socket->write(data, len); //寫數據 socket ->waitForBytesWritten();
socket->waitForReadyRead(); //等待讀取數據
qDebug()<< "Received Bytes:" << socket->read(buf, sizeof(buf)-1);
socket ->disconnectFromHost(); //斷開連接 socket ->waitForDisconnected();
未完待續,下章來學習客戶端與服務器實例