一、TCP/UDP
1、osi模型
物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層(下層為上層提供服務)
2、TCP/IP模型(TCP/IP協議棧)
應用層:
HTTP(超文本傳輸協議)、FTP(文件傳輸協議)、DNS、DHCP
傳輸層:
TCP(傳輸控制協議)、UDP(用戶數據報)
網絡層:
IP(互聯網協議)、ICMP(互聯網控制消息協議)ARP(ip->mac)RARP(mac->ip)
接口層:以太網協議....
3、常見的協議
DNS:域名解析
DHCP:動態主機配置協議,功能:自動分配IP地址
4、 ip地址
IP地址?==?網絡位?+?主機位(ip地址的前三組是網絡地址,第四組是主機地址)
有A?B?C?D?E?類五類地址
5、網絡接口
套接字:用于網絡通信的一組接口函數(文件描述符)
ip+port(地址+端口):地址用來識別主機,端口用來識別進程
端口號范圍:1-65535
網絡設備是大端存儲,計算機設備是小端存儲
6、udp特性(發不會阻塞,收會阻塞)
1.?無連接?
不需要維護繁雜網絡狀態。網絡開銷小。通信雙方通信過程,無法知道對方進程關閉。如果需要告知,需要發信息通知。 (每次發數據,鏈路發完自動釋放,下次發會選擇新的鏈路)
2.?不可靠,?
傳輸數據的過程中,會有丟包。但是實時性好。適用直播?視頻傳輸,音頻傳輸。3、數據報:數據間有邊界,收發次數需要對應
【很容易實現一對多 、可以組播,廣播】
7、UDP:客戶端-服務端
8、網絡模型
C/S:專用客戶端,標準協議,自定義協議,功能復雜,大部分資源都在客戶端(和本地客戶端打交道)
B/S:通用客戶端,超文本協議,功能相對較弱,資源都在服務器,(和瀏覽器打交道)
p2p模型:(peer to peer)用于直播,下載工具
9、TCP:傳輸控制協議(相當于打電話)特性:
1、有鏈接(一次會話中,鏈接會一直保持。如果一個斷開,另外一方可以感知),
2、可靠:應答,超時重傳
3、流式套接字:(有順序、發送和接受的次數不需要對應,發的太快會出現寫阻塞,數據之間沒有邊界)
注意:
數據之間沒有邊界會導致數據的黏包(接收收到數據后,無法正常解析)
1.協商邊界
2.固定大小
3.自定義協議?
?10、TCP:客戶端-服務端
重點代碼:網絡編程——聊天程序實現-CSDN博客
11、三次握手,四次揮手
三次握手:
客戶端-->SYN(請求連接),c_num-->服務器
服務器-->SYN/ACK,s_num-->客戶端
客戶端-->ACK-->服務器
四次揮手:
客戶端--> FIN(斷開連接)/ACK -->服務器
服務器--> ACK -->客戶端
服務器-->FIN/ACK-->客戶端
客戶端-->ACK-->服務器
?二、HTTP相關
1、網絡協議頭和工具
協議頭(數據的封包和拆包)
客戶端,從應用層發hello,經過傳輸層加tcp,網絡層加ip,接口層加ip,變成一幀數據(mtu,最大傳輸單元1500字節,,分片?),經過互聯網,到服務器逐層拆包,到服務器應用層輸出hello.
- MAC(以太網V2幀格式):目地址,源地址,ip數據報
- IP(20個字節大小):ip flags(x d(能不能分片)m(是不是最后一片)),TTL(生存時間:默認值64,每經過一個網絡節點ttl減1,數字減為0則不再繼續傳遞)
- TCP(20個字節大小):標志位(urg,ack,psh(抓包時:沒有標準協議就找push,有標準協議就找相關協議),pst,syn,fin?),window(滑動窗口)
(UDP,8個字節大小)
2、網絡測試工具:
telnet/ssh2:遠程登錄工具
netstat -anp/ping/arp:常用命令
wireshark:網絡抓包工具
tcpdump:命令行抓包工具
3、萬維網
統一資源定位符URL,標志萬維網的各種文檔(相當于網頁鏈接)
HTTP的URL的一般形式:
http://<主機>:<端口>/<路徑>
超文本傳送協議HTTP,使用TCP可靠傳輸(加s就是加密傳輸)
超文本標記語言HTML
4、HTTP操作過程:
- 客戶端與服務器建立連接(三次握手)
- 客戶端發送請求報文
- 服務器收到請求,發送響應報文+加對應數據
- 斷開連接(四次揮手)
5、HTTP報文結構
請求報文:
第一行:方法(get/post)+URL+HTTP版本號+回車換行\r\n
首部行:狀態說明信息(鍵值對)
實體:請求實體(一般為空)
響應報文
三、多路IO復用(服務器和多客戶端)
1、定義:單線程或單進程同時監測若干個文件描述符是否可以執行IO操作的能力
(進線程消耗資源,多路IO復用用最少的資源解決更多的事)
2、IO模型:
1、阻塞IO? 閑等待(不占cpu等待):有名管道
2、非阻塞IO 忙等待(占著cpu等待)
3、信號驅動IO
4、并發模型 (進程/線程,相對多路IO比較消耗系統資源)
5、IO多路復用(可以處理單進程或單線程中,多個阻塞)
3、 fctnl設置非阻塞
?//將fd置為非阻塞模式
? int flag = fcntl(fd,F_GETFL,0);
? fcntl(fd,F_SETFL,flag|O_NONBLOCK);//將標準輸入(0)也設置為非阻塞模式。
? flag = fcntl(0,F_GETFL,0);
? fcntl(0,F_SETFL,flag|O_NONBLOCK);
4、fctnl設置信號驅動(代碼運行和系統版本相關)(了解即可)
? //把設備設置為信號驅動的方式
? int flag = fcntl(fd,F_GETFL,0);
? fcntl(fd,F_SETFL,flag|O_ASYNC);
? //設置接收sigio信號的進程
? fcntl(fd,F_SETOWN,getpid());
5、IO多路復用:由操作系統提供的對IO事件進行檢測的機制 (select,poll,epoll)
6、select函數實現多路IO復用(輪詢方法)
創建集合(fd_set)
把文件描述符放進集合(FD_SET)
select輪詢掃描,(返回值:有幾個就是有幾個描述符準備好)
找到對應的fd,進行讀寫操作(FD_LSSET)
清除讀寫標志位
注意點:
select最多檢測1024fd
select在檢測fd的方式是輪詢的方式
select在找對應fd時,需要在原始集合(就緒和未就緒的在一個集合)找
7、epoll函數實現多路IO復用(主動上報)
創建集合 (epoll_create)
把文件描述符放進集合(epoll_ctl)
調用epoll_wait等待讀寫事件的到來,并把就緒fd存入就緒集合(rev)
在rev集合找到對應的fd,進行讀寫操作
注意點:
不限制文件描述符的限制
監聽的性能不會隨監聽描述符增加而下降
epoll在rev集合(只有就緒fd)中找
使用共享內存的方式(不需要用戶和內核反復進行復制)
四、TCP并發模型
服務器/多客戶端模型
1、循環服務器(while(accept();recv()))
2、并發服務器(進線程)
3、多路IO模型服務器(select epoll)
1、select
注意點:
maxfd + 1
告訴select
需要檢查的文件描述符范圍是0
到maxfd
(包含maxfd
)。如果
maxfd
不更新,select
可能漏掉新連接的高 fd。
2、epoll
3、線程進程并發
3.1進程
signal(SIGCHLD, myhandle)
的作用是 處理子進程終止信號(SIGCHLD),避免僵尸進程的積累。
3.2線程
pthread_detach(pthread_self());
分離屬性:線程退出時,系統自動回收資源,無需
pthread_join
信號量:
使用信號量同步,確保線程先讀取
conn
,主線程再進入下一輪循環
sem_wait(&sem_arg)
:主線程阻塞,等待子線程讀取conn
。
sem_post(&sem_arg)
:子線程讀取完conn
后,通知主線程繼續。