TCP/IP協議總結(馬士兵教育)


 

一. 應用層

模擬和百度進行通訊:

1.建立連接(內核去做的)

exec 8<> /dev/tcp/www.baidu.com/80 

#含義: /dev/tcp/www.baidu.com/80:與百度的80端口通過socket技術建立了tcp連接,用8去指向了這個連接,從連接中可以拿到輸入流和輸出流       # 8<>  相當於是一個輸入輸出流的channel(通道),8就是文件描述符.

# exec [-cl] [-a 名稱] [命令 [參數 ...]] [重定向 ...]  這個用法會用指定命令去替換shell.只不過上面那句話中沒有[命令]這個選項,只是添加了一個重定向.可以通過cd /proc/$$/fd 中找到這個重定向.     #$$代表當前解釋程序(應該指的是一個終端窗口),fd文件描述符.  可以echo $$看出這個解釋程序的進程號.

2.http通訊(用戶去做)

echo -e "GET / HTTP/1.0\n" 1>& 8  #/表示主頁,-e能夠讓\n得到轉義,1表示echo的標准輸出, 后面是重定向到前面定義的8中. 注意這里, > 到文件;    >& 到文件描述符.

 

3.讀取百度回復的消息(用戶去做的)

cat 0<& 8

 

cd /proc/$$/fd #$$代表當前解釋程序(應該指的是一個終端窗口),fd文件描述符.

shell:外殼,相對於內核來說的.

 

二.傳輸控制層(TCP/IP)

1.TCP:

面向連接, 可靠的傳輸.

為什么握手要三次?

socket的IO通訊是雙向的,兩對syn+ack,分別表示客戶端確認自己發送的消息服務端能夠收到,以及服務端發送的客服端能夠收到.

三次握手之后,雙方開辟了資源.

 

2.linux中查看網絡狀態

  ssh:secure shell,安全外殼協議,應用層協議.ftp,telnet本質上是不安全的.

 這里的Local Address就是代表的你說連接到的linux服務器,而Foreign Address表示對端地址.

上面的是每個socket對應一個進程,而多個socket對應一個進程就是 多路復用器 (select, poll, epoll).

 

3.抓取訪問百度過程(通過curl www.baidu.com)的數據包,驗證3次握手和四次分手.

  其中[S]代表的是SYN,[.]代表的是ACK.[F]代表FIN.

中間的部分表示數據傳輸,一開始是1440字節,然后客戶端給一個確認;接着是1341字節,然后客戶端給一個確認.(因為數據包的大小是有限制的,比如圖中說的[mss 1460])

 

三.網絡層和數據鏈路層

 

 

 IP地址 & 子網掩碼得到網絡號;

 

理解路由表中表示的含義:

如果要訪問百度的ip,拿百度的ip去和路由表中的子網掩碼進行按位與操作, 得到的結果跟路由表中的Destination列的值去進行匹配.這里只有和0.0.0.0去按位與得到0.0.0.0可以與第一條匹配上,這個時候就去找對應的Gateway,這里是192.168.121.2.然后網站再去找到百度的地址.

而訪問本局域網中的ip,和255.255.255.0按位與之后,得到的是網絡號,它對應的網關是0.0.0.0,表示不需要通過網關轉發.

 

在傳輸過程中,數據包中究竟需要存儲目標ip的地址還是下一跳的地址呢?

實際上存儲的是目標ip,只不過在數據包外層要封裝下一跳的mac地址

 

查看arp表中的內容:

arp -a

 

 

刪除網關的mac地址,再去請求外網:

arp -d 192.168.121.2 && curl www.qq.com

 

tcpdump -nn -i ens33 port 80 or arp

 

 

 發現會先進行arp請求,找到網關的mac地址,再去進行三次握手和四次分手的過程.

 

手動添加網關,理解網關的含義

假如原先主機A(192.168.121.4)和主機B(192.168.121.1)是同一個網段,此時它們兩個是可以互相訪問的.現在在主機B上添加一個ip地址ipB2,比如說是192.168.88.88(通過ifconfig ens33:0 192.168.88.88 netmask 255.255.255.0 up),此時主機A是訪問不到該地址的.因為主機A的路由表中並沒有到此地址的路由.如下圖所示,是主機A的路由表,在ping 192.168.88.88時,會對子網掩碼進行與運算,匹配到192.168.121.2(下一跳地址),但是121.2並不能夠找到88.88,所以無法去訪問.

在主機A中可以通過人為添加路由的方式,來找到88.88地址.方式如下:

 

 

告訴主機A,如果要訪問88.88可以通過121.1.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM