? ? ?TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它廣泛應用于互聯網中的數據通信,如網頁瀏覽、文件傳輸、電子郵件等。以下是TCP通信的基本概念和工作原理:
1.?TCP的特點
面向連接:通信前需建立連接,通信結束后釋放連接。
可靠性:通過確認、重傳、校驗等機制確保數據準確無誤地傳輸。
有序性:數據按發送順序到達接收方。
流量控制:通過滑動窗口機制防止接收方被發送方的數據淹沒。
擁塞控制:通過擁塞窗口和算法避免網絡擁塞。
2.?TCP通信的基本流程
-
)建立連接(三次握手):
-
SYN:客戶端發送SYN報文(SYN=1,seq=x)請求連接。
-
SYN-ACK:服務器回復SYN-ACK報文(SYN=1,ACK=1,seq=y,ack=x+1)。
-
ACK:客戶端發送ACK報文(ACK=1,seq=x+1,ack=y+1)確認連接。
-
-
)數據傳輸:
-
連接建立后,雙方通過發送和接收數據包進行通信。
-
每個數據包都有序列號和確認號,確保數據有序且可靠。
-
-
)斷開連接(四次揮手):
-
FIN:一方發送FIN報文(FIN=1,seq=u)請求關閉連接。
-
ACK:另一方回復ACK報文(ACK=1,seq=v,ack=u+1)確認關閉請求。
-
FIN:另一方發送FIN報文(FIN=1,seq=w,ack=u+1)請求關閉連接。
-
ACK:一方回復ACK報文(ACK=1,seq=u+1,ack=w+1)確認關閉請求。
-
3.?TCP報文結構
TCP報文包括以下字段:
源端口和目的端口:標識通信的應用程序。
序列號(Sequence Number):標識數據字節流的順序。
確認號(Acknowledgment Number):期望收到的下一個字節的序列號。
數據偏移:TCP頭部的長度。
控制位:如SYN、ACK、FIN等,用于控制連接狀態。
窗口大小:用于流量控制。
校驗和:用于錯誤檢測。
緊急指針:標識緊急數據的位置。
4.?TCP的應用場景
HTTP/HTTPS:網頁瀏覽。
FTP:文件傳輸。
SMTP/POP3/IMAP:電子郵件。
SSH:遠程登錄。
數據庫連接:如MySQL、PostgreSQL等。
5.?TCP與UDP的區別
TCP:可靠、面向連接、有序,適合對可靠性要求高的場景。
UDP:不可靠、無連接、無序,適合對實時性要求高的場景,如視頻流、在線游戲。
6.?TCP的優缺點
優點:可靠性高,數據有序,適合長連接和大量數據傳輸。
缺點:建立和斷開連接開銷大,實時性較差。
主窗口UI
TCP窗口
調試助手
TCP與網絡助手之間的通訊
網絡助手發送消息在主窗口與TCP窗口同時顯示
主窗口與網絡助手之間的通訊
TCP窗口
1,創建字段及委托
public Socket socket = null;
public delegate void SetText(string text);//本窗口跨線程委托
public Tcp_ServerRevStr tcp_ServerRevStr;//其他窗口跨線程委托
2,創建及連接
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//實例化Socket
IPAddress iPAddress = IPAddress.Parse("127.0.0.1");//定義要連接的IP
int port = 502;//默認Port 端口 接口
IPEndPoint iPEnd = new IPEndPoint(iPAddress, port);
try
{socket.Connect(iPEnd);//鏈接Socket
}
catch (Exception ex)
{MessageBox.Show("鏈接失敗"+ex.Message);
}
Thread th = new Thread(ReceiveDate);//另開線程接受消息
th.IsBackground = true;//后臺線程
th.Start();//開啟
3,顯示消息
//防止跨線程給界面賦值出錯
if (this.RcvText.InvokeRequired)//先判斷是否需要委托
{SetText st = new SetText(ShowText);this.Invoke(st, new object[] { text });
}
else
{this.RcvText.Text = text;
}
4,接收消息
while (true)
{byte[] resBuffer = new byte[1024 * 2];//生命最大字符內存int length = -1;//字節長度try{length = socket.Receive(resBuffer);}catch (SocketException ex){break;}catch (Exception ex){MessageBox.Show("與服務器斷開:" + ex.Message);}if (length > 0)//接收消息{try{string msg = Encoding.Default.GetString(resBuffer);ShowText(msg);tcp_ServerRevStr(msg);//其他窗口跨線程委托調用}catch (Exception ex){MessageBox.Show(ex.Message);}}}
5,發送消息
public void sendMessage(string text)
{try{byte[] buffer = Encoding.Default.GetBytes(text);socket.Send(buffer);//發送數據}catch (Exception ex){MessageBox.Show(ex.Message);}
}
FormMain窗口
1,委托
public delegate void Tcp_ServerRevStr(string msg1);//服務端委托
2,實例化窗口
FormTcpService formTcp = new FormTcpService();//實例化TCP窗口
3,加載窗口
private void button1_Click(object sender, EventArgs e){formTcp.Show();formTcp.tcp_ServerRevStr += tcpClientReceviceStr;}
4,接受并顯示消息
private void tcpClientReceviceStr(string msg)
{//跨線程接受消息Action action;action = delegate(){textBox1.Text = msg;};this.Invoke(action);
}
5,發送消息
private void btn_senMessage_Click(object sender, EventArgs e)
{formTcp.sendMessage(this.textBox2.Text);
}