一、UDP用戶數據報
? ? ? ? 收發次數要對應;
? ? ? ? 數據與數據之間有邊界,多次調用收發時都是不同的數據報;
? ? ? ? 接收方的數據大小>=發送方的數據大小,如果接受方數據小了則會丟棄未讀的部分,再次調用只會讀下一包數據;
二、服務器/客戶端模型
? ? ? ? 1.c/s client/server
? ? ? ? 服務器客戶端模型:
? ? ? ? 客戶端是專用的;
? ? ? ? 可以使用http等標準協議,也可以使用自定義協議;
? ? ? ? 資源大部分都在cli里,只有必要的交互數據由客戶端發;
? ? ? ? 受到的限制較小,功能相對復雜;
? ? ? ? 2.b/s browser/server
? ? ? ? 瀏覽器客戶端模型:
? ? ? ? 客戶端是通用的;
? ? ? ? 用的是http;
? ? ? ? 都是客戶端發給服務器;
? ? ? ? 在傳輸數據過程中受到http的限制,功能不復雜;
? ? ? ? 3.p2p peer to peer
? ? ? ? 一般是用于直播;
? ? ? ? 服務器給傳輸數據,其他進度快的客戶端也給傳輸數據,如果本客戶端進度快也會傳輸數據給其他客戶端;
三、TCP傳輸控制協議
? ? ? ? 1.流式套接字,數據是連續的,有順序的;
????????可靠傳輸方式,有鏈路,有應答機制,如果發送沒應答將自動重傳;
? ? ? ? 全雙工通信,同一時刻既可以收又可以發,可以同時進行;
? ? ? ? 雙緩沖區,收發互不影響;
? ? ? ? 2.三次握手:
????????建立連接:
? ? ? ? 客戶端發送連接請求SYN;
? ? ? ? 服務端發送連接請求SYN和ACK;
? ? ? ? 客戶端應答ACK建立連接;
? ? ? ? 3.四次揮手
? ? ? ? 斷開連接:
? ? ? ? 客戶端發送斷開請求FIN和ACK;
? ? ? ? 服務器應答ACK;
? ? ? ? 服務區發送斷開請求FIN和ACK;
? ? ? ? 客戶端應答ACK;
? ? ? ? 4.緩沖區大小64k,寫得太快會寫阻塞;
? ? ? ? 5.socket
? ? ? ? #include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ? #include <sys/socket.h>
? ? ? ? int socket(int domain, int type, int protocol);
? ? ? ? type:SOCK_STREAM-流式套接字;
? ? ? ? 6.地址127.0.0.1代表自己,但只能自己通自己;
? ? ? ? INADDR_ANY表示全監聽,接收所有信息,可以被別人找到;
? ? ? ? 7.listen
? ? ? ? 把服務器調成可被鏈接的狀態(監聽狀態);? ? ? ?
? ? ? ?#include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ?#include <sys/socket.h>
? ? ? ?int listen(int sockfd, int backlog);
? ? ? ? backlog:同一時刻可以連接的最大個數,第backlog+1個直接被拒絕;
? ? ? ? 8.accept
? ? ? ? 阻塞直到有客戶端連接;
????????#include <sys/types.h> ? ? ? ? ?/* See NOTES */
????????#include <sys/socket.h>
? ? ? ? int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
? ? ? ? 9.recv
????????#include <sys/types.h>
????????#include <sys/socket.h>
? ? ? ? ssize_t recv(int sockfd, void *buf, size_t len, int flags);
? ? ? ? 10.send
????????#include <sys/types.h>
????????#include <sys/socket.h>
????????ssize_t send(int sockfd, const void *buf, size_t len, int flags);
? ? ? ? 11.connect
? ? ? ? 客戶端發出連接請求;
? ? ? ? #include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ? #include <sys/socket.h>
? ? ? ? int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
? ? ? ? 12.tcp中通過套接字找到地址
????????#include <sys/socket.h>
? ? ? ? int getpeername(int socket,struct sockaddr* addr,socklen_t ?*addrlen)
? ? ? ? 13.數據的粘包????????
? ? ? ? 發送方發啊送你數據,接收方無法解析數據。
? ? ? ? 解決:設置邊界(eg:\0);固定大小;自定義協議;
四、TCP和UDP的差別
? ? ? ? 1.UDP無連接,需要寫標識退出;
? ? ? ? TCP有鏈接,(三次握手四次揮手)整個通信過程都會保持連接;
? ? ? ? 2.UDP不可靠,數據有丟包風險;
? ? ? ? TCP可靠,數據之間沒有邊界;
? ? ? ? 3.UDP數據報,發送次數和接收次數需要對應,數據與數據之間有邊界;
? ? ? ? TCP流式套接字,次數不必對應;
? ? ? ? 4.UDP沒有擁塞控制;
? ? ? ? TCP超時重傳;
? ? ? ? 5.廣播、組播只能用UDP;
? ? ? ? 6.首部開銷小;
? ? ? ? 7.TCP是全雙工通信,有雙緩沖區,而UDP只有一個緩沖區,某時刻要么收要么發;