
一. 應用層
模擬和百度進行通訊:
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.
