學(xué)習(xí)指導(dǎo)1.Python 學(xué)習(xí)資料1. 廖雪峰的官方網(wǎng)站 http://www./wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 2. Python快速教程 http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html 3. python 幫助 2.TCPIP基礎(chǔ)學(xué)習(xí)2.1 TCPIP協(xié)議分層2.1.1 分層原理發(fā)送端:程序員編寫的應(yīng)用程序通過socket 函數(shù)庫的使用, 比如調(diào)sendto 或者send或者write , 這些函數(shù)在操作系統(tǒng)的用戶態(tài)空間,進入操作系統(tǒng)的系統(tǒng)調(diào)用,調(diào)操作系統(tǒng)的sys_xxx 函數(shù),進入操作系統(tǒng)的內(nèi)核態(tài)。 內(nèi)核態(tài)的網(wǎng)絡(luò)子系統(tǒng)(專門處理網(wǎng)卡、TCPIP協(xié)議的代碼), sys_sendto 判斷 是UDP還是TCP,如果是TCP,則調(diào) TCP_output 函數(shù),TCP_output負責(zé)填寫TCP首部的數(shù)據(jù),比如發(fā)送方的端口號和接收方的端口號、以及校驗和(簡單校驗,防止數(shù)據(jù)錯誤)。 緊接著進入IP層處理,調(diào)IP_output,查找路由(因為設(shè)備可能有多個網(wǎng)卡, 那怎么選擇? 根據(jù)目的IP地址來選路,類似于查地圖,找到哪個網(wǎng)卡), IP_output 填寫發(fā)送者的IP地址和接收者的IP地址信息。 IP層首部按固定格式填好之后,那么就進入鏈路層(由物理層所決定,早起有的設(shè)備并沒有網(wǎng)卡,有的是直連的電話線或者串口等設(shè)備, 而網(wǎng)卡的設(shè)備識別ID是MAC地址, 6個字節(jié)。) 不同的鏈路層處理函數(shù)是不同的,如果是網(wǎng)卡,則是ethernet_output, 鏈路層的處理則是需要填寫自己的MAC地址和對方的MAC地址。 對方的MAC地址從哪里來?后面會講到。 鏈路層獲取到對方的MAC地址后,就把報文按固定格式填好,這個時候,所有的數(shù)據(jù)都按固定格式組裝完畢, 調(diào)網(wǎng)卡的驅(qū)動程序的函數(shù) physic_send 發(fā)送(會觸發(fā)軟中斷或者加入隊列,寫一個消息,CPU后續(xù)從網(wǎng)卡獲取數(shù)據(jù)發(fā)送出去。) 接收端: 接收端網(wǎng)卡收到數(shù)據(jù)后,觸發(fā)了中斷, 報文的內(nèi)容被寫入一個隊列中,觸發(fā)一個軟中斷, 操作系統(tǒng)的內(nèi)核線程會去讀取隊列中的數(shù)據(jù)。讀到數(shù)據(jù)后,先解析是以太網(wǎng)的格式還是其他物理設(shè)備的格式。 以太網(wǎng) 的首部是14個字節(jié)(目的MAC是自己網(wǎng)卡的,報文才允許接收, 廣播報文也默認會接收) 內(nèi)核線程調(diào)ethernet_input函數(shù)處理,如果是IP報文,則調(diào) ip_input函數(shù),進行IP首部報文正確性檢查,如果目的IP地址屬于自己某個網(wǎng)卡的,則是屬于自己設(shè)備的報文,如果不是,要轉(zhuǎn)給其他設(shè)備(類似于路由器)(實際情況,判斷報文是不是自己設(shè)備,不是根據(jù)IP地址,而是根據(jù)路由表,后續(xù)再講) IP_input 檢查報文中的 8位協(xié)議號 信息,如果是TCP 就調(diào)tcp_input函數(shù)處理,如果是udp,則調(diào)udp_input函數(shù)處理,如果是ping報文(準備叫法是icmp),則調(diào)icmp_input函數(shù)處理。 最后tcp_input或者udp_input講報文入了tcp或者udp的數(shù)據(jù)隊列中,等程序員寫的socket程序 調(diào)recv或者recvfrom函數(shù)把數(shù)據(jù)讀走,繼續(xù)用于自己的數(shù)據(jù)解析,如,如果是HTTP報文,則進行http報文解析處理。 2.1.2 Ping 的原理說明Ping 是一個應(yīng)用程序,是通過socket 編程實現(xiàn)的, 通過創(chuàng)建一個raw socket。 socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 通過代碼 構(gòu)造IP首部、ICMP首部,將報文發(fā)送出去。 ICMP 請求 報文 8位類型和8位代碼是8和0 而ping的應(yīng)答報文 的type code是0和0 舉例 PC1 192.168.2.1 執(zhí)行ping 的應(yīng)用程序,發(fā)送報文給 PC3 192.168.2.3 而實際上PC3 192.168.2.3上是沒有啟動應(yīng)用程序的,但是結(jié)果能ping 通? 原因是? PC3 中 操作系統(tǒng)的內(nèi)核收到ICMP 請求報文后, 直接進行了ICMP應(yīng)答,即這個報文不會到達應(yīng)用程序(因為不需要?只需要知道這個IP地址真實存在就OK了) ,但是這個應(yīng)答報文需要 送給PC1 的應(yīng)用程序? 為什么? 因為ping 是應(yīng)用程序發(fā)送出來的,那么應(yīng)用程序必然需要知道到底是成功還是失敗或者超時了。 2.1.3 Wireshark抓取 www.huawei.com 的報文 打開 wireshark ,選擇真實的物理網(wǎng)卡 鼠標(biāo)選擇報文某個字段, 右鍵 選擇 apply as filter 可以選擇性報文, 同時也可以 && tcp 或者&& http 選擇報文類型抓包 2.1.4 上網(wǎng)的完整原理 1. 寬帶辦理 家庭A和家庭B 屬于一個小區(qū)的兩家用戶 ,分別辦理了寬帶。 家庭A的路由器和家庭B的路由器 通電后,會發(fā)送廣播報文(這個時候還沒有IP地址) 發(fā)送給電信的交換機(交換機轉(zhuǎn)給電信路由器) ,電信路由器對 家庭A/B路由器響應(yīng), 家庭A/B 將用戶名和密碼填寫到報文里面, 電信路由器收到報文后,根據(jù)密碼進行判斷,如果在自己的用戶名列表且密碼正確,則給每家分配一個IP地址,IP地址是201.1.1.10和201.1.1.20 ,同時在報文里面將DNS服務(wù)器 114.114.114.11的地址帶給A/B 結(jié)合實際家里的路由器舉例: 在瀏覽器輸入192.168.1.1 可以查看自己家路由器的信息 10.68.166.75 就是電信路由器給家庭分配的IP地址; 10.64.0.10 和10.64.0.100 是電信路由器在分配IP地址的過程中攜帶回來的DNS服務(wù)器IP, 相當(dāng)于組網(wǎng)圖中的114.114.114.114 2. 手機和電腦的IP地址從哪里來的? 手機和電腦的IP的地址是從自己的路由器分配的(當(dāng)然也可以手動配置IP地址,但是管理起來比較復(fù)雜),采用的是DHCP 自動分配IP地址。 比如,查看自己的電腦 點 開始 --à運行 輸入 ipconfig /all 備注: 通常情況下 自己家路由器的DNS server 也是192.168.1.1 ,這里的114.114.114.114是我修改的,有時候網(wǎng)頁訪問出現(xiàn)問題,和DNS 有關(guān)。 手機和電腦開機后,通過DHCP協(xié)議(后續(xù)再講)從家庭路由器 192.168.1.1 中獲取IP地址和DNS服務(wù)器的IP地址,得到192.168.1.10/192.168.1.20,并得到DNS 服務(wù)器192.168.1.1 3. DNS獲取 手機 開始上網(wǎng) 瀏覽器輸入www.google.com 互聯(lián)網(wǎng)訪問時基于IP地址的,這個時候需要獲取www.google.com對應(yīng)的真實IP地址。 手機檢查本地系統(tǒng)DNS緩存有沒有g(shù)oogle的歷史記錄,如果沒有,就向 自己的家庭路由器 192.168.1.1 這個IP地址發(fā)送DNS 請求查詢(請告訴我 google的IP) , 家庭路由器 看看自己的DNS緩存有沒有,如果沒有,就向電信的DNS服務(wù)器 114.114.114.114 查詢(請告訴我 google的IP), 如果電信DNS也沒有,即向國際頂級DNS 服務(wù)器8.8.8.8(備注: 8.8.8.8實際是google的DNS服務(wù)器,這里只是舉例), 只要開通了DNS注冊,交錢的國際企業(yè)在 頂級域名是有記錄的(除非只在某個范圍內(nèi)生效)。 最終手機就可以獲取到www.google.com IP地址是圖中9.9.9.20。 那么手機就可以將 192.168.1.1 發(fā)給 9.9.9.20 的http報文發(fā)送出去。 4 .報文通過路由器轉(zhuǎn)發(fā) 手機 訪問 9.9.9.20(google)的http報文 , 手機 à 家庭路由器 源IP地址是192.168.1.10 ,目的IP地址是9.9.9.20 ; 這里有個問題: 別人家也有一個192.168.1.10,那么google的服務(wù)器怎么知道是誰家的 192.168.1.10? 數(shù)據(jù)在互聯(lián)網(wǎng)上傳輸,肯定是需要一個唯一的IP地址,那么對每家來說,唯一的IP地址是電信分配的。也就是說,每家只能用自己的IP地址作為源IP地址。 那么我家里有多臺手機和電腦,怎么辦? 手機1 192.168.1.10: 789 à 9.9.9.20: 80 被家庭路由器SNAT 成 201.1.1.10: 123à 9.9.9.20: 80 電腦1 192.168.1.20: 678 à 9.9.9.20: 80被家庭路由器SNAT 成 201.1.1.10: 124à 9.9.9.20: 80 也就是說,數(shù)據(jù)出了自己的路由器,整個過程源IP地址、目的IP地址、源端口號、目的端口號都是不變的,直到到達google, google返程 分別回給201.1.1.10:123和201.1.1.20:124 數(shù)據(jù)到達家庭路由器后,重新把目的IP地址換回192.168.1.10和192.168.1.20。最終完成數(shù)據(jù)的傳輸過程。 3 TCPIP學(xué)習(xí)3.1 ARP學(xué)習(xí)基礎(chǔ)3.1.1 ARP報文以太網(wǎng)是根據(jù)MAC地址識別的。 PC1 學(xué)習(xí)到了PC3 的MAC地址,才可以發(fā)送報文,否則無法ping通,比如把 PC3移除。 192.168.2.1 向 192.168.2.3 發(fā)送 ARP報文,根據(jù)ARP的報文格式 類型 0x0800表示 ARP報文 。 發(fā)送ARP請求,只知道 自己的MAC地址,自己的IP地址, 對方的IP地址,但是不知道對方的MAC地址。 相當(dāng)于 我要找人,這個人在我視線范圍,但是我不認識他。那么我喊一下(廣播),讓所有的人都能聽到。 目的MAC地址填 ff-ff-ff-ff-ff-ff 。 所有收到的人 判斷一下是不是自己的IP地址,如果是自己的IP地址,那么就單播應(yīng)答一下。 這樣一來,雙方都能知道對方的MAC地址。 記錄到內(nèi)存里面。因為下一個使用的時候不需要重新發(fā)送報文,提高效率。 但是如果一直不再給對方發(fā)送數(shù)據(jù),也不知道對方還在不再。那么又存在浪費內(nèi)存的情況。最好的方式是設(shè)置一個超時時間,默認20分鐘。 如果20分鐘到了,再重新發(fā)送一次,如果能學(xué)習(xí)到,說明還在,繼續(xù)保留這個表象。 在Windows7上 運行 開始 cmd 輸入 arp –a 可以觀察到這個表項 3.1.2Hub和交換機的區(qū)別 Hub組網(wǎng), PC1 ping PC3 ,在 PC2上可以抓到所有報文 但是把HUB換成交換機, PC1 ping PC3, 在PC2上只能抓到ARP請求報文(確切說是廣播報文) 為什么? 3.1.3 路由器組網(wǎng)下的ARP學(xué)習(xí)組網(wǎng)如圖,啟動三個設(shè)備 雙擊 路由器 給路由器配置IP地址 <Huawei>sys [Huawei]interface Ethernet 0/0/0 [Huawei-Ethernet0/0/0]ip address 192.168.1.1 24 [Huawei-Ethernet0/0/0]q [Huawei]interface ethernet0/0/1 [Huawei-Ethernet0/0/1]ip address 192.168.2.1 24 在PC1 192.168.1.10 上ping PC2 192.168.2.20 如果沒有路由器, PC1和PC2是不同網(wǎng)段, 是ping 不通的。如果換成交換機或者HUB,也是ping 不通的。 跨網(wǎng)段必須需要一個路由器來轉(zhuǎn)發(fā)(備注:這里的交換機指二層交換機,三層交換機具備路由器的特征,可以三層轉(zhuǎn)發(fā); 二層表示是同一個網(wǎng)段) 觀察,為什么PC1 沒有PC2的MAC地址? 而只有路由器192.168.1.1的MAC地址? 3.2 觀察windows 上的路由表3.3路由的選路過程3.4 DHCP 的過程3.3 TCP的報文交互 4 socket編程(python)Server.py Client.py |
|
來自: 常有理 > 《IT技術(shù)》