前言
前面專題的例子都是基於應用層上的http協議的介紹, 現在本專題來介紹下傳輸層協議——tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。
一、tcp的工作過程
首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可以分為三個階段:一、連線的建立; 二、傳輸資料; 三、斷開連線,下面就對這三個過程分別介紹下:
1.1 連線的建立
tcp的連線建立就像打**一樣, 我們打**時,撥乙個號碼的號碼並不是立即就可以接通的,期間會有乙個「嘟 嘟」的呼叫過程, 這就好比是tcp協議的連線的建立階段。當我們用tcp編寫的程式,必須先建立tcp連線。tcp協議的連線建立通過三次握手來完成的,下面是在網上找的一張tcp三次握手的:
下面就對這三次握手簡單的介紹:
第一次握手:建立連線時,客戶端傳送syn包(seq=x)到伺服器,並進入syn_send狀態,等待伺服器確認
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=x+1),同時自己也傳送乙個syn包(seq=y),即syn+ack包,此時伺服器進入syn_recv狀態
第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=y+1),此包傳送完畢,客戶端和伺服器進入established(建立)狀態,完成三次握手。
簡單理解三次握手就是傳送乙個檢驗包給對方然後互相確認,雙方都接到確認的乙個訊號時,這時候雙方就建立了連線(就像我們打**時,如果沒人說話時就會說下 「喂」,說這句「喂」 也就是希望得到對方的乙個確認,雖然這裡雙方已經建立了連線的,這裡只是更形象的說明下三次握手的過程)。
1.2 傳輸資料
雙方建立了連線,即在雙方建立了乙個通訊通道(就像一座橋一樣,在兩端建立了乙個通路,用橋來比喻通訊通道主要是因為最近有一則新聞:哈爾濱陽明灘大橋坍塌事件),建立連線之後,當然是傳輸我們需要傳輸的資料到對方的,這裡就開始簡單介紹下傳輸資料的過程。
利用tcp傳輸資料時,資料是以位元組流的形式進行傳輸,客戶端與伺服器端建立連線後,傳送方需要先將傳送的資料轉換為位元組流,然後將其傳送給對方,傳送資料時,可以通過程式不斷地將資料流陸續寫入tcp的傳送緩衝中,然後tcp自動從傳送緩衝中提取一定量的資料,將其組成tcp報文段傳送到ip層,再通過ip層(也就是網路層)之下的網路介面傳送出去;接受端從ip層接收到tcp報文段後,將其暫時儲存在接受緩衝中,然後我們通過程式依次讀取接受緩衝中的資料,從而達到相互通訊的目的(簡單的說就傳送方把資料轉換為資料流,再把資料流儲存在傳送緩衝中,然後傳輸層低層的協議從傳送緩衝中讀取資料把資料傳送出去,然後接收端從底層接受到資料把資料儲存在接收端的緩衝中,然後我們寫的程式只是從緩衝中依次讀取資料,然後顯示出來,在客戶端我們寫**做的事情是把資料寫入write寫入傳送端的緩衝中,然後伺服器端(接收端)用read方法在自己的緩衝中讀取資料,用一句話概括,tcp的傳輸就是對資料的寫——讀操作)括號中的內容只是我個人理解,因為這樣我感覺理解起來比較容易,對於剛開始接觸tcp的朋友可以這樣理解,然後再一句句話去擴充套件。
1.3 斷開連線
tcp的工作過程就分為上面三個過程,tcp程式設計是作為上層應用程式設計的基礎,就像之前專題中基於http協議的web伺服器,web瀏覽器,其傳輸層都用的是tcp協議進行傳輸的,還有基於ftp(檔案傳輸協議),imap(互動式郵件訪問協議) pop3(郵局協議的第3個版本) 和smtp(簡單郵件傳輸協議)的網路應用其傳輸層都用的是tcp協議,而不是udp等其他傳輸層協議。
二、基於tcp協議的簡單通訊程式
這裡簡單實現了乙個客戶端與伺服器間的通訊程式,核心**為:
客戶端連線伺服器端**:
private客戶端傳送訊息的**:void btnconnect_click(object
sender, eventargs e)
//連線伺服器方法,建立連線的過程
private
void
connecttoserver()
ipaddress ipaddress =ipaddress.parse(tbxserverip.text);
tcpclient = new
tcpclient();
tcpclient.connect(ipaddress,
int.parse(tbxport.text));
//延時操作
thread.sleep(1000
);
if (tcpclient != null
)
}catch
}
//伺服器端接受開始監聽客戶端請求的**:傳送訊息
private
void btnsend_click(object
sender, eventargs e)
private
void sendmessage(object
state)
catch
if (writer != null
)
if (tcpclient != null
)
statusstripinfo.invoke(showstatuscallback,
"斷開了連線");}}
//現在看看執行的結果:開始監聽
private
void btnstart_click(object
sender, eventargs e)
//接受請求
private
void
acceptclientconnect()
}catch
}
首先先啟動伺服器然後點開始監聽,此時執行緒會堵塞,直到接受到乙個連線請求位置
通過接受按鈕和傳送按鈕來實現雙方的通訊,實現介面如下:
三、總結
C 網路程式設計系列 專題五 TCP程式設計
前言 前面專題的例子都是基於應用層上的http協議的介紹,現在本專題來介紹下傳輸層協議 tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。一 tcp的工作過程 首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可...
C 網路程式設計系列 專題五 TCP程式設計
前言 前面專題的例子都是基於應用層上的http協議的介紹,現在本專題來介紹下傳輸層協議 tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。一 tcp的工作過程 首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可...
c 網路程式設計之TCP
此專案的目的是分別編寫tcp的客戶端和服務端程式並為兩者建立通訊,客戶端收到從服務端傳送的服務端本地時間。此專案在dev c 5.11下開發,需要用到的庫有winsock2.h,以及靜態鏈結檔案wsock32.lib。需要分別建立兩個專案server和client,先執行server.cpp,再執行...