C語言實現聊天室,p2p DAY 1

2021-10-23 03:29:01 字數 2012 閱讀 8590

知識儲備先:

程序——程序;差錯檢測;可靠傳輸;連線管理;擁塞控制

協議特性,連線性:兩端維護,實體與實體之間傳,一對一單播,暫存傳送資訊,什麼時候發由實現tcp實現(程式設計師),客戶機——服務機:通過socket傳輸資料

報文格式大概了解,傳輸中我覺得很重要的是urg(立即傳送)和psh(接受後立即執行)位和urg指標指示緊急資料(控制資訊), syn建立連線,fin釋放連線;mss:同一物理網路【硬體介質(網線、交換機、路由器、主機)連線而成的網路】,最大mtu,不同物理網路,最小mtu,因為減少路由器儲存**次數,提高傳輸效率;

差錯檢測:校驗和+偽頭;兩次檢測;字首不屬於tcp段;含有源ip,目標ip,協議特性,tcp段長;

tcp連線的建立和釋放(三次握手):

建立:

客戶機 -> 伺服器:同步控制報文sny=1,seq=x(請求連線,i為資料流的起始序號)

伺服器 -> 客戶機:ack=1,ack=x+1,syn=1,seq=y(伺服器資料流的起始序號j)

客戶機 -> 伺服器:ack=1,ack=y+1,seq = x+1(表示收到確認,並將其值,作為自己的序號值)至此連線建立完成(雙向建立)

釋放:(改進的三次握手,設定計時器避免確認丟失導致一直重發確認(兩軍對壘),四次揮手)

客戶機-> 伺服器:fin(請求釋放連線),seq= u請求關閉

伺服器 -> 客戶機:ack,ack=u+1,seq = v 確認然後通知應用程式

客戶機關閉傳送連線(前兩次揮手既讓伺服器知道了客戶機想要關閉連線,且客戶機已經得到伺服器的確認,故可以關閉客戶機到伺服器方向的傳輸通道)

伺服器 -> 客戶機:fin,seq = w,ack=u+1 伺服器請求關閉連線(已經準備好釋放連線了。注意:這裡的ack並不是確認收到伺服器端報文的確認報文。)

客戶機-> 伺服器:ack,序號為seq=u+1;ack = w+1(表示是在收到了伺服器端報文的基礎上,將其確認號ack值作為本段報文序號的值)伺服器關閉傳送連線  (釋放是單獨釋放,超時值設為2個msl)

有限狀態機:

握手之前,客戶機主動離開close,客戶機主動開啟鏈結,接收到connect()原語,傳送syn進入syn sent狀態;

握手前,伺服器被動開啟從close進入listen狀態,表示等待客戶端的連線,收到syn,傳送ack+syn,進入syn rcvd狀態;(也有不想連線的時候,若不想建立連線則通過close傳送fin,進入fin wait 1狀態;客戶端接收到fin,傳送ack,進入closing狀態,表示雙方同時關閉連線;伺服器接收到ack進入timed wait狀態;超時後雙方關閉)

客戶機收到syn+ack,傳送ack進入established狀態

伺服器收到ack,進入established狀態,連線建立成功

關閉時,也由客戶機主動關閉,客戶機主動釋放連線的客戶端,離開established狀態,客戶機tcp實體接收到close()原語傳送fin,進入fin wait 1狀態(半關閉狀態),請求關閉傳送通道(傳送通道是指正常連線時,傳送的資料(非確認報文);而非一切資料);

伺服器收到fin,傳送ack,進入close wait狀態,表示同意關閉接收通道,但是很可能伺服器的資料還沒傳送完,還要繼續傳送;

客戶機收到ack進入fin wait 2狀態,此時傳送通道(一向)已關閉,客戶機等待伺服器傳送連線釋放報文(在這之前還需要接受伺服器傳送的最後的資料);

伺服器端的資料傳送完之後,告知客戶機關閉連線,傳送fin,傳送ack,進入last ack狀態;

客戶機收到fin,傳送ack進入timed wait狀態,連線還未釋放,必須等待2個msl後,刪掉連線進入closed狀態;

伺服器收到ack後,立即進入closed狀態,至此傳送通道關閉,雙向通道關閉。(伺服器關閉比客戶機稍早)

有限狀態機的描述參考博文:

Flash聊天室的實現 2

b flash部分 1 在屬性面板上,將第一幀的 幀標籤 設為 login 在第一幀的action面板中加上 stop 2 如圖1所示,在場景中放置兩個文字框,兩個button,其中上面乙個文字框的設定如圖2所示,另乙個文字框的設定如圖3所示。3 新建乙個元件,命名為 loginloop1 在第一幀...

多執行緒聊天室的實現 C

使用mfc進行網路程式設計,實現多執行緒聊天室 1.mfc網路程式設計要包含庫檔案 include 可以在stdafx.h中包含此檔案 以下是主要 實現部分 1.首先編寫初始化套接字的函式 名稱 initstocket 功能 初始化套接字 bool cudpchatdlg initsocket so...

基於C 實現TCP聊天室功能

tcpserver.cpp tcpserver.cpp defines the entry point for the console application.include stdafx.h include include include using namespace std pragma co...