1. TCP
TCP: 傳輸控制協議(Transmission Control Protocol),傳輸層協議之一(TCP,UDP)
2. TCP與UDP
UDP(用戶數據報協議)
- 面向數據報
- 無連接
- 不安全不可靠(盡最大努力交付)
- 機制簡單,傳輸效率高
TCP(傳輸控制協議)
- 需要建立連接
- 安全、可靠
- 面向字節流
- 占用資源開銷大?
3. 三次握手
? ? ? ? 指建立tcp連接時,需要客戶端和服務端總共發送三次報文確認連接
4. 四次揮手
? ? ? ? 斷開一個tcp連接,需要客戶端和服務端發送四個報文以確認斷開?
TCP編程:基于C/S模型的socket文件進行通信
5. TCP框架設計
- client: socket--->connect--->send/write--->close
- server:?? ?socket--->bind--->listen--->accept---> recv/read--->close
6. 函數接口
6.1 socket
????????socket(AF_INET, SOCK_STREAM, 0);
6.2 connect
????????int connect(int sockfd, const struct sockaddr *addr,
? ? ? ? ? ? ? ? ? ?socklen_t addrlen);
功能:
????????發送三次握手鏈接請求
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?addr:存放目的地址空間首地址
?? ??? ?addrlen:目的地址長度
返回值:
?? ??? ?成功返回0?
?? ??? ?失敗返回-1???
6.3 send
????????ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
????????發送數據
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?buf:存放數據空間首地址
?? ??? ?len:數據長度
?? ??? ?flag:屬性默認為0?
返回值:
?? ??? ?成功返回發送字節數
?? ??? ?失敗返回-1???
6.4 recv
????????ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
?? ??? ?接收數據?
參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?buf:存放數據空間首地址?
?? ??? ?len:最多接收數據長度?
?? ??? ?flags:接收屬性默認為0?
返回值:
?? ??? ?成功返回實際接收字節數
?? ??? ?失敗返回-1?
?? ??? ?連接斷開返回0?
6.5 bind
? ? ? ? int bind(int sockfd, const struct sockaddr *addr,
? ? ? ? ? ? ? ? socklen_t addrlen);
6.6 listen
? ? ? ? int listen(int sockfd, int backlog);
?? ? ?功能:
?? ??? ?監聽三次握手鏈接請求
?? ? ?參數:
?? ??? ?sockfd:套接字文件描述符
?? ??? ?backlog:最多允許等待尚未處理的三次握手鏈接個數
?? ? ?返回值:
?? ??? ?成功返回0?
?? ??? ?失敗返回-1?
6.7 accept
? ? ? ? int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
????????處理三次握手等待隊列中的第一個請求并建立一個用來通信的新套接字
參數:
????????sockfd:套接字文件描述符
????????addr:存放發送端IP地址空間首地址?
????????addrlen:想要接收的IP地址的長度?
返回值:
????????成功返回新文件描述符
????????失敗返回-1?
7. TCP粘包
TCP協議是面向字節流的協議,接收方不知道消息的界限,不知道一次提取多少數據,這就造成了粘包問題
產生原因
- TCP發送數據時,沒有及時發走,會根據緩沖區數據的情況進行重新組包
- TCP接收方,沒有及時讀走緩沖區數據,導致緩沖區大量數據緩存
解決方案
- 消息定長法:對于定長的包,保證每次都按固定大小讀取即可????????// ?結構體
- 添加消息頭:在每個數據包前添加固定長度的消息頭,消息頭中記錄數據包的長度等信息。發送方發送數據時,先發送消息頭,再發送實際數據。接收方先讀取消息頭,獲取數據包長度信息,再根據該長度讀取后續的實際數據
- 特殊字符分隔法:在數據包之間添加特殊的分隔字符(‘\n’),發送方發送數據時,在每個數據包后加上分隔字符,接收方按分隔字符來分割數據包
8. TCP報文頭
標志位:
- URG: 緊急指針標志, 為1時表示緊急指針有效, 該報文應該優先傳送。
- ACK: 確認應答標志
- PSH: ?表示發送數據,提示接收端從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間
- RST: 重置連接標志
- SYN: 表示請求建立一個連接
- FIN: finish標志, 表示釋放連接
滑動窗口大小:是TCP流量控制得一個手段。目的是告訴對方,本端的TCP接受緩沖區還能容納多少字節得數據,這樣對方就可以控制發送數據的速度,從而達到流量控制,16bit,因而窗口最大65535
9. TCP機制
保證可靠性的同時又要盡可能的提高性能
可靠性:
- 三次握手和四次揮手機制
- 應答機制:TCP將每個字節的數據都進行了編號,即為序列號。每一個ACK都帶有對應的確認序列號,保證數據不丟失的按序到達
- 超時重傳:當發送端發送的數據在網絡中丟失時,在一定時間內沒有收到接收端的ACK,則發送端會重新發送丟失數據。
- 流量控制:按照ACK中“窗口大小”字段控制發送端的發送速度
提高性能:
- 滑動窗口:可以按照“窗口大小”, 一次發送多條后, 再等待應答
- 延遲應答:當接收方處理速度很快時,可以延遲發送ACK,此時"窗口大小"會自動增大
- 捎帶應答:搭載應用層的響應報文發送ACK