tcp、udp對比:
UDP
- 無連接:無需建立連接即可發送數據。
- 不可靠:不保證數據順序或完整性。
- 低延遲:適合實時性要求高的場景。
- 視頻/音頻流傳輸(如直播)。
- DNS 查詢、在線游戲。
TCP
- 面向連接:通過三次握手建立連接。
- 可靠傳輸:通過序列號SYN、ACK 確認和重傳機制保證數據完整性。
- 流量控制:滑動窗口機制避免網絡擁塞。
一、三次握手和四次揮手和其余機制
🌟 1. 三次握手的第二個階段為什么是 ACK+SYN?
核心目標:同步序列號 + 確認能力。
TCP 是全雙工協議,雙方需獨立確認發送和接收能力。
SYN 用于交換初始序列號(ISN),ACK 用于確認收到 SYN。
合并原因:
減少網絡開銷(從 4 次握手優化為 3 次)。
服務器收到 SYN 后必須立即確認(ACK),同時需同步自己的序列號(SYN)。
🌟 2. 四次揮手的確認和結束為什么要分開發送?
核心目標:非對稱關閉 + 數據傳輸可能性。
一方可能仍有數據需要發送(如 HTTP 響應剩余部分)。
FIN 表示“無數據發送”,ACK 表示“已收到 FIN”。
分開發送原因:
被動關閉方可能無法立即停止發送數據。
合并 FIN+ACK 會導致被動關閉方無法完成剩余數據傳輸。
🌟 3. 關鍵差異總結
方面 | 三次握手 | 四次揮手 |
目標 | 雙向同步序列號 + 確認能力 | 非對稱關閉連接 |
SYN/FIN 的角色 | 同步初始序列號(必須立即確認) | 請求關閉連接(可能延遲發送) |
ACK 的角色 | 確認?SYN (必須立即發送) | 確認?FIN (可能延遲發送) |
合并的必要性 | 合并為?SYN+ACK ?減少開銷 | 無法合并,因? |
其余機制:
1.應答機制:為每個數據增加序列發,發送數據時,第一個數據的序號作為報文中的序號。接收方收到相關數據,會回應ACK報文,報文中的確認號是接收方下次希望接收到的數據的起始序號
2.超時重傳機制:TCP發送數據后會在一定的時間內等待ACK,假設在指定時間ACK未收到,則視為此數據包丟失,
二、 tcp相關接口
1. send 函數
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:發送數據。
參數:
sockfd:套接字文件描述符。
buf:數據緩沖區首地址。
len:數據長度。
flags:默認設為 0。
返回值:
成功:發送的字節數。
失敗:-1。
2. recv 函數
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:從 TCP 套接字接收數據。
參數:
sockfd:套接字文件描述符。
buf:保存接收數據的緩沖區首地址。
len:期待接收的字節數。
flags:默認設為 0。
返回值:
成功:實際接收的字節數。
發送端關閉時:返回 0。
失敗:-1。
3. listen 函數
int listen(int sockfd, int backlog);
功能:監聽三次握手請求。
參數:
sockfd:套接字文件描述符。
backlog:等待處理的三次握手請求的最大數量。
返回值:
成功:0。
失敗:-1。
4. accept 函數
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:處理三次握手隊列中的第一個請求,創建新套接字。
參數:
sockfd:套接字文件描述符。
addr:保存客戶端 IP 地址的緩沖區首地址。
addrlen:IP 地址長度。
返回值:
成功:新套接字文件描述符。
失敗:-1。
三、TCP粘包問題
1.TCP在接受數據時,多包數據粘在一起
2.原因:
? ? ? ? (1)TCP發送數據時,會根據緩沖區數據的情況進行重新組包
? ? ? ? (2)TCP接收方,沒有及時讀走緩沖區數據,導致緩沖區大量數據緩存。
3.如何解決
? ? ? ? (1)發指定大小字節
將要發數據,封裝在結構體里
struct data
{
? ? ? ? int id;
? ? ? ? float tmp;
? ? ? ? xxx
};?
缺點:發送端與接收端體系不同,32位與64位對齊方式的不同造成數據丟失;所有要在指定的相同平臺使用,注意結構體對齊問題。
? ? ? ? (2)發送具有指定分隔符的數據
? ? ? ? hello world\n
? ? ? ? miss you\n
? ? ? ? (3)封裝自定義數據幀
? ? ? ? AA len0C ?0001 0112 1314 1504 XXXX XXXXBB
? ? ? ? 校驗:8位和校驗
? ? ? ? ? ? ? ? ? 16位和校驗
四、網絡抓包
抓取通過設備網卡的數據
wireshark:網絡抓包工具
????????1.分析和追蹤網絡問題
????????2.查看網絡協議棧
安裝:sudo apt-get install wireshark
1.sudo wireshark
2.選擇通信設備的網卡==》any
3.選擇抓取的過濾條件
4.開始抓取
5.進行一次通信
五、TCP報文頭
標志位:緊急指針標志,為I時表示緊急指針有效,該報文應該優先傳送,
1. URG:
確認應答標志
2 ACK:
表示發送數據,提示接收端從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間
3.PSH:
4. RST:重置連接標志
表示請求建立一個連接5.SYN:
fmish標志,表示釋放連接6.FN