標籤:des blog http 使用 strong os
相關文章:程式員的自我修養——作業系統篇
幾乎所有的電腦程式,都會牽涉到網路通訊。因此,瞭解電腦基礎網路知識,對每一個程式員來說都是異常重要的。
本文在介紹一些基礎網路知識的同時,給出了一些高品質的系列文章連結,以方便大家隨時參考學習。相信通過本文的學習,你能對電腦網路有全面的認識!
在閱讀本文之前,建議閱讀以下兩遍文章,以便對”電腦網路是如何工作”的有個大概的瞭解。
互連網協議入門(一)
互連網協議入門(二)
接下來,我們介紹一些基礎網路知識。
OSI參考模型
一上來就是OSI七層參考模型,是不是有點暈?如果是,那先閱讀文章開頭推薦的那兩篇文章吧!
第7層:應用程式層(ApplicationLayer)
應用程式層能與應用程式介面溝通,以達到展示給使用者的目的。在此常見的協議有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第6層:展示層(PresentationLayer)
展示層能為不同的用戶端提供資料和資訊的文法轉換內碼,使系統能解讀成正確的資料。同時,也能提供壓縮解壓、加密解密。
第5層:會話層(SessionLayer)
會話層用於為通訊雙方制定通訊方式,並建立、登出會話(雙方通訊)。
第4層:傳輸層(TransportLayer)
傳輸層用於控制資料流量,並且進行調試及錯誤處理,以確保通訊順利。而發送端的傳輸層會為分組加上序號,方便接收端把分組重組為有用的資料或檔案。
第3層:網路層(NetworkLayer)
網路層的作用是決定如何將發送方的資料傳到接收方。該層通過考慮網路擁塞程度、服務品質、發送優先權、每次路由的耗費來決定節點X到節點Y的最佳路徑。我們熟知的路由器就工作在這一層,通過不斷的接收與傳送資料使得網路變得相互聯通。
第2層:資料連結層(DatalinkLayer)
首先資料連結層的功能在於管理第一層的位元資料,並且將正確的資料發送到沒有傳輸錯誤的路線中。建立還有辨認資料開始以及退出的位置同時予以標記。另外,就是處理由資料受損、丟失甚至重複傳輸錯誤的問題,使後續的層級不會受到影響,所以它運行資料的調試、重傳或修正,還有決定裝置何時進行傳輸。裝置有:Bridge橋接器switch交換器
第1層:物理層(PhysicalLayer)
物理層定義了所有電子及物理裝置的規範。其中特別定義了裝置與物理媒介之間的關係,這包括了針腳、電壓、線纜規範、集線器、中繼器、網卡、主機介面卡(在SAN中使用的主機介面卡)以及其他的裝置的設計定義。因為物理層傳送的是原始的位元資料流,即設計的目的是為了保證當發送時的訊號為二進位“1”時,對方接收到的也是二進位“1”而不是二進位“0”。因而就需要定義哪個裝置有幾個針腳,其中哪個針腳發送的多少電壓代表二進位“1”或二進位“0”,還有例如一個bit需要持續幾微秒,傳輸訊號是否在雙向上同時進行,最初的串連如何建立和最終如何終止等問題。
為了更好理解物理層與資料連結層之間的區別,可以把物理層認為是主要的,是與某個單一裝置與傳輸媒介之間的互動有關,而資料連結層則更多地關注使用同一個通訊媒介的多個裝置(例如,至少兩個裝置)之間的互動。物理層的作用是告訴某個裝置如何傳送訊號至一個通訊媒介,以及另外一個裝置如何接收這個訊號(大多數情況下它並不會告訴裝置如何與通訊媒介相串連)。有些過時的物理層標準如RS-232倒是的確使用物理線纜來控制通訊媒介的接入。
物理層的主要功能和提供的服務如下:
- 在裝置與傳輸媒介之間建立及終止串連。
- 參與通訊過程使得資源可以在共用的多使用者中有效分配。例如,衝突解決機制和流量控制。
- 對訊號進行調製或轉換使得使用者裝置中的數字訊號定義能與通道上實際傳送的數字訊號相匹配。這些訊號可以經由物理線纜(例如銅纜和光纜)或是無線通道傳送。
TCP/IP的5層模型
相比於OSI的七層模型,更常用的是TCP/IP的5層模型。TCP/IP的5層模型是將ISO的七層模型的應用程式層、展示層、會話層合并為應用程式層,得到如所示的五層模型:
TCP/IP通訊的三向交握、四次揮手
三向交握:
第一次握手:用戶端發送syn包(syn=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=y+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
握手過程中傳送的包裡不包含資料,三向交握完畢後,用戶端與伺服器才正式開始傳送資料。理想狀態下,TCP串連一旦建立,在通訊雙方中的任何一方主動關閉串連之前,TCP串連都將被一直保持下去。
與建立串連的“三向交握”類似,斷開一個TCP串連則需要“四次握手”。
第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的資料傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發資料了(當然,在fin包之前發送出去的資料,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些資料),但是,此時主動關閉方還可以接受資料。
第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號)。 第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的資料傳送,也就是告訴主動關閉方,我的資料也發送完了,不會再給你發資料了。 第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。
戲說TCP/IP狀態轉化圖
TCP/IP協議是電腦網路中的一個協議族,也是網路編程中的重頭戲!理解TCP/IP狀態轉化圖,對理解TCP/IP協議的工作過程異常重要。
如所示,描述了一個狀態機器到另一個狀態機器的轉變,已經觸發這種狀態轉變的條件。
狀態圖詳細說明如下:
1.CLOSED:起始點,在逾時或者串連關閉時候進入此狀態。
2.LISTEN:svr端在等待串連過來時候的狀態,svr端為此要調用socket,bind,listen函數,就能進入此狀態。此稱為應用程式被動開啟(等待用戶端來串連)。
3.SYN_SENT:用戶端發起串連,發送SYN給伺服器端。如果伺服器端不能串連,則直接進入CLOSED狀態。
4.SYN_RCVD:跟3對應,伺服器端接受用戶端的SYN請求,伺服器端由LISTEN狀態進入SYN_RCVD狀態。同時伺服器端要回應一個ACK,同時發送一個SYN給用戶端;另外一種情況,用戶端在發起SYN的同時接收到伺服器端得SYN請求,用戶端就會由SYN_SENT到SYN_RCVD狀態。
5.ESTABLISHED:伺服器端和用戶端在完成3次握手進入狀態,說明已經可以開始傳輸資料了。
以上是建立串連時伺服器端和用戶端產生的狀態轉移說明。相對來說比較簡單明了,如果你對三向交握比較熟悉,建立串連時的狀態轉移還是很容易理解。
下面,我們來看看串連關閉時候的狀態轉移說明,關閉需要進行4次雙方的互動,還包括要處理一些善後工作(TIME_WAIT狀態),注意,這裡主動關閉的一方或被動關閉的一方不是指特指伺服器端或者用戶端,是相對於誰先發起關閉請求來說的:
6.FIN_WAIT_1:主動關閉的一方,由狀態5進入此狀態。具體的動作是發送FIN給對方。
7.FIN_WAIT_2:主動關閉的一方,接收到對方的FIN-ACK,進入此狀態。由此不能再接收對方的資料。但是能夠向對方發送資料。
8.CLOSE_WAIT:接收到FIN以後,被動關閉的一方進入此狀態。具體動作是接收到FIN,同時發送ACK。
9.LAST_ACK:被動關閉的一方,發起關閉請求,由狀態8進入此狀態。具體動作是發送FIN給對方,同時在接收到ACK時進入CLOSED狀態。
10.CLOSING:兩邊同時發起關閉請求時,會由FIN_WAIT_1進入此狀態。具體動作是接收到FIN請求,同時響應一個ACK。
11.TIME_WAIT:最糾結的狀態來了。從狀態圖上可以看出,有3個狀態可以轉化成它,我們一一來分析:
a.由FIN_WAIT_2進入此狀態:在雙方不同時發起FIN的情況下,主動關閉的一方在完成自身發起的關閉請求後,接收到被動關閉一方的FIN後進入的狀態。
b.由CLOSING狀態進入:雙方同時發起關閉,都做了發起FIN的請求,同時接收到了FIN並做了ACK的情況下,由CLOSING狀態進入。
c.由FIN_WAIT_1狀態進入:同時接受到FIN(對方發起),ACK(本身發起的FIN回應),與b的區別在於本身發起的FIN回應的ACK先於對方的FIN請求到達,而b是FIN先到達。這種情況機率最小。
關閉的4次串連最難理解的狀態是TIME_WAIT,存在TIME_WAIT的2個理由:
1.可靠地實現TCP全雙工系統串連的終止。
2.允許老的重複分節在網路中消逝。
MAC地址的概念及其作用
MAC地址(MediaAccessControlAddress),媒體存取控制地址,或稱為物理地址,是用來定義網路裝置的位置的。在OSI模型中,第三層網路層負責IP地址,第二層資料鏈結層則負責MAC地址。一個主機會有一個IP地址,而每個網路位置會有一個專屬於它的MAC地址。
ARP協議的用途及其工作原理
位址解析通訊協定(AddressResolutionProtocol),其準系統為通過目標裝置的IP地址,查詢目標裝置的MAC地址,以保證通訊的順利進行。它是IPv4中網路層必不可少的協議,不過在IPv6中已不再適用,並被鄰居發現協議(NDP)所替代。
在每台安裝有TCP/IP協議的電腦或路由器裡都有一個ARP緩衝表,表裡的IP地址與MAC地址是一對應的,如下表所示。
主機名稱 |
IP地址 |
MAC地址 |
A |
192.168.38.10 |
00-AA-00-62-D2-02 |
B |
192.168.38.11 |
00-BB-00-62-C2-02 |
C |
192.168.38.12 |
00-CC-00-62-C2-02 |
D |
192.168.38.13 |
00-DD-00-62-C2-02 |
E |
192.168.38.14 |
00-EE-00-62-C2-02 |
… |
… |
… |
以主機A(192.168.38.10)向主機B(192.168.38.11)發送資料為例。當發送資料時,主機A會在自己的ARP緩衝表中尋找是否有目標IP地址。如果找到了,也就知道了目標MAC地址為(00-BB-00-62-C2-02),直接把目標MAC地址寫入幀裡面發送就可以了;如果在ARP緩衝表中沒有找到相對應的IP地址,主機A就會在網路上發送一個廣播(ARPrequest),目標MAC地址是“FF.FF.FF.FF.FF.FF”,這表示向同一網段內的所有主機發出這樣的詢問:“192.168.38.11的MAC地址是什嗎?”網路上其他主機並不響應ARP詢問,只有主機B接收到這個幀時,才向主機A做出這樣的回應(ARPresponse):“192.168.38.11的MAC地址是(00-BB-00-62-C2-02)”。
這樣,主機A就知道了主機B的MAC地址,它就可以向主機B發送資訊了。同時它還更新了自己的ARP緩衝表,下次再向主機B發送資訊時,直接從ARP緩衝表裡尋找就可以了。ARP緩衝表採用了老化機制,在一段時間內如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少ARP緩衝表的長度,加快查詢速度。
瞭解交換器、路由器、網關的概念,並知道各自的用途
1)交換器
在電腦網路系統中,交換器是針對共用工作模式的弱點而推出的。交換器擁有一條高頻寬的背部匯流排和內部交換矩陣。交換器的所有的連接埠都掛接在這條背部匯流排上,當控制電路收到資料包以後,處理連接埠會尋找記憶體中的地址對照表以確定目的MAC(網卡的硬體地址)的NIC(網卡)掛接在哪個連接埠上,通過內部交換矩陣迅速將資料包傳送到目的連接埠。目的MAC若不存在,交換器才廣播到所有的連接埠,接收埠回應後交換器會“學習”新的地址,並把它添加入內部地址表中。
交換器工作於OSI參考模型的第二層,即資料連結層。交換器內部的CPU會在每個連接埠成功串連時,通過ARP協議學習它的MAC地址,儲存成一張ARP表。在今後的通訊中,發往該MAC地址的資料包將僅送往其對應的連接埠,而不是所有的連接埠。因此,交換器可用於劃分資料連結層廣播,即衝突域;但它不能劃分網路層廣播,即廣播域。
交換器被廣泛應用於二層網路交換,俗稱“二層交換器”。
交換器的種類有:二層交換器、三層交換器、四層交換器、七層交換器分別工作在OSI七層模型中的第二層、第三層、第四層盒第七層,並因此而得名。
2)路由器
路由器(Router)是一種電腦網路裝置,提供了路由與轉送兩種重要機制,可以決定資料包從來源端到目的端所經過的路由路徑(host到host之間的傳輸路徑),這個過程稱為路由;將路由器輸入端的資料包移送至適當的路由器輸出端(在路由器內部進行),這稱為轉送。路由工作在OSI模型的第三層——即網路層,例如網際協議。
路由器的一個作用是連通不同的網路,另一個作用是選擇資訊傳送的線路。路由器與交換器的差別,路由器是屬於OSI第三層的產品,交換器是OSI第二層的產品(這裡特指二層交換器)。
3)網關
網關(Gateway),網關顧名思義就是串連兩個網路的裝置,區別於路由器(由於曆史的原因,許多有關TCP/IP的文獻曾經把網路層使用的路由器(Router)稱為網關,在今天很多區域網路採用都是路由來接入網路,因此現在通常指的網關就是路由器的IP),經常在家庭中或者小型商業網路中使用,用於串連區域網路和Internet。網關也經常指把一種協議轉成另一種協議的裝置,比如語音網關。
在傳統TCP/IP術語中,網路裝置只分成兩種,一種為網關(gateway),另一種為主機(host)。網關能在網路間轉遞資料包,但主機不能轉送資料包。在主機(又稱終端系統,endsystem)中,資料包需經過TCP/IP四層協議處理,但是在網關(又稱中介系統,intermediatesystem)只需要到達網際層(Internetlayer),決定路徑之後就可以轉送。在當時,網關(gateway)與路由器(router)還沒有區別。
在現代網路術語中,網關(gateway)與路由器(router)的定義不同。網關(gateway)能在不同協議間移動資料,而路由器(router)是在不同網路間移動資料,相當於傳統所說的IP網關(IPgateway)。
網關是串連兩個網路的裝置,對於語音網關來說,他可以串連PSTN網路和乙太網路,這就相當於VOIP,把不同電話中的類比訊號通過網關而轉換成數字訊號,而且加入協議再去傳輸。在到了接收端的時候再通過網關還原成類比的電話訊號,最後才能在電話機上聽到。
對於乙太網路中的網關只能轉寄三層以上資料包,這一點和路由是一樣的。而不同的是網關中並沒有路由表,他只能按照預先設定的不同網段來進行轉寄。網關最重要的一點就是連接埠映射,子網內使用者在外網看來只是外網的IP地址對應著不同的連接埠,這樣看來就會保護子網內的使用者。
初識路由表
路由表(routingtable)或稱路由擇域資訊庫(、RoutingInformationBase),是一個儲存在路由器或者連網電腦中的試算表(檔案)或類資料庫。路由表格儲存體著指向特定網路地址的路徑(在有些情況下,還記錄有路徑的路由度量值)。路由表中含有網路周邊的拓撲資訊。路由表建立的主要目標是為了實現路由協議和靜態路由選擇。
路由表使用了和利用地圖投遞包裹相似的思想。只要網路上的一個節點需要發送資料給網路上的另一個節點,它就必須要知道把資料發送到哪。裝置不可能直接連接到目的節點,它需要找到另一個方式去發送資料包。在區域網路中,節點也不知道如何發送IP包到網關。將資料包發到正確的地址是一個複雜的任務,網關需要記錄發送資料包的路徑資訊。路由表就儲存著這樣的路徑資訊,就如地圖一樣,是一個記錄路徑資訊,並為需要這些資訊的節點提供服務的資料庫。
如所示為一張路由表:
路由表參數說明:
Destination:目的網段 mask:子網路遮罩 interface:到達該目的地的本路由器的出口ip gateway:下一跳路由器入口的ip,路由器通過interface和gateway定義一調到下一個路由器的鏈路,通常情況下,interface和gateway是同一網段的 metric:跳數,該條路由記錄的品質,一般情況下,如果有多條到達相同目的地的路由記錄,路由器會採用metric值小的那條路由
MTU
傳輸單元最大值(MaximumTransmissionUnit,MTU)是指一種通訊協定的某一層上面所能通過的最大資料包大小(以位元組為單位)。傳輸單元最大值這個參數通常與通訊介面有關(網路介面卡、串口等)。
網際網路協議允許IP分區,這樣就可以將資料包分成足夠小的片段以通過那些傳輸單元最大值小於該資料包原始大小的鏈路了。這一分區過程發生在網路層(OSI模型的第三層),第四層為傳輸層,傳輸層是OSI模型中最重要的一層,這裡是根據視窗控制傳輸,而非MTU。傳輸協議同時進行流量控制或是基於接收方可接收資料的快慢程度規定適當的發送速率。
除此之外,傳輸層按照網路能處理的最大尺寸將較長的資料包進行強制分割。例如,乙太網路無法接收大於1500位元組的資料包。發送方節點的傳輸層將資料分割成較小的資料片,同時對每一資料片安排一序號,以便資料到達接收方節點的傳輸層時,能以正確的順序重組,該過程即被稱為排序。它使用的是將分組發送到鏈路上的網路介面的傳輸單元最大值的值。
乙太網路MTU值為1500位元組。
RIP、OSPF、BGP認識
路由資訊協議(RoutingInformationProtocol,RIP)是一種使用最廣泛的內部閘道通訊協定(IGP)。(IGP)是在內部網路上使用的路由協議(在少數情形下,也可以用於串連到網際網路的網路),它可以通過不斷的交換資訊讓路由器動態適應網路連接的變化,這些資訊包括每個路由器可以到達哪些網路,這些網路有多遠等,RIP屬於網路層。
開放式最短路徑優先(OpenShortestPathFirst,OSPF)是對鏈路狀態路由協議的一種實現,是大中型網路上使用最為廣泛的IGP(InteriorGatewayProtocol)協議,運作於自治系統內部。著名的迪克斯加演算法被用來計算最短路徑樹。它使用“代價(Cost)”作為路由度量。鏈路狀態資料庫(LSDB)用來儲存當前網路拓撲結構,它在同一地區中的所有路由器上是相同的。
BGP(邊界網關協議,BorderGatewayProtocol)是自治系統之間的路由選擇協議,是互連網上一個核心的去中心化自治路由協議。
BGP是唯一一個用來處理像網際網路大小的網路的協議,也是唯一能夠妥善處理好不相關路由網域間的多路串連的協議。BGP構建在EGP的經驗之上。BGP系統的主要功能是和其他的BGP系統交換網路可達資訊。網路可達資訊包括列出的自治系統(AS)的資訊。這些資訊有效地構造了AS互聯的拓樸圖並由此清除了路由環路,同時在AS層級上可實施策略決策。
DNS
DNS(DomainNameSystem,網域名稱系統),網際網路上作為網域名稱和IP地址相互映射的一個分散式資料庫,能夠使使用者更方便的訪問互連網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名稱,最終得到該主機名稱對應的IP地址的過程叫做網域名稱解析(或主機名稱解析)。DNS協議運行在UDP協議之上,使用連接埠號碼53。
TCP、UDP和HTTP區別於聯絡
TCP/IP協議是一個協議簇,這個協議簇中包含了很多種協議,TCP、UDP和HTTP只是TCP/IP協議簇的成員。之所以命名為TCP/IP協議,因為TCP,IP協議是兩個很重要的協議,就用他兩命名了。
1)TCP/IP協議簇,大致可分為三個層次:網路層、傳輸層和應用程式層。 在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。 在傳輸層中有TCP協議與UDP協議。 在應用程式層有FTP、HTTP、TELNET、SMTP、DNS等協議。 HTTP也是一個協議,是從Web伺服器傳輸超文本到本地瀏覽器的傳送協議。
2)HTTP協議是建立在請求/響應模型上的。首先由客戶建立一條與伺服器的TCP連結,並發送一個請求到伺服器,請求中包含要求方法、URI、協議版本以及相關的MIME樣式的訊息。伺服器響應一個狀態行,包含訊息的協議版本、一個成功和失敗碼以及相關的MIME式樣的訊息。 HTTP/1.0為每一次HTTP的請求/響應建立一條新的TCP連結,因此一個包含HTML內容和圖片的頁面將需要建立多次的短期的TCP連結。一次TCP連結的建立將需要3次握手。 另外,為了獲得適當的傳輸速度,則需要TCP花費額外的迴路連結時間(RTT)。每一次連結的建立需要這種經常性的開銷,而其並不帶有實際有用的資料,只是保證連結的可靠性,因此HTTP/1.1提出了可持續連結的實現方法。HTTP/1.1將只建立一次TCP的連結而重複地使用它傳輸一系列的請求/響應訊息,因此減少了連結建立的次數和經常性的連結開銷。
3)雖然HTTP本身是一個協議,但其最終還是基於TCP的。目前,有人正在研究基於TCP+UDP混合的HTTP協議。
在瀏覽器中輸入一個網站後,都發生了什麼
詳細參見:互連網協議入門(二)
以上講述了一些電腦網路相關的術語,概念,當然,一切才剛剛開始。
如果,你需要瞭解更多。我可以很負責任的告訴你:以下連結是你更深入的瞭解電腦網路工作機制的最佳資源,是被奉為聖經的《TCP-IP詳解-卷I》一書的精華內容,出自vamei君。
TCP-IP協議詳解(1)郵差與郵局 (網路通訊協定概觀)
TCP-IP協議詳解(2) 小喇叭開始廣播 (乙太網路與WiFi協議)
TCP-IP協議詳解(3) IP接力賽(IP, ARP, RIP和BGP協議)
TCP-IP協議詳解(4)地址耗盡危機(IPv4與IPv6地址)
TCP-IP協議詳解(5) 我儘力(IP協議詳解)
TCP-IP協議詳解(6) 瑞士軍刀 (ICMP協議)
TCP-IP協議詳解(7) 傀儡(UDP協議)
TCP-IP協議詳解(8) 不放棄 (TCP協議與流通訊)
TCP-IP協議詳解(9) 愛的傳聲筒(TCP串連)
TCP-IP協議詳解(10) 魔鬼細節 (TCP滑窗管理)
TCP-IP協議詳解(11) 涅槃 (TCP重新發送)
TCP-IP協議詳解(12) 天下為公(TCP堵塞控制)
TCP-IP協議詳解(13) 9527(DNS協議)
TCP-IP協議詳解(14) 逆襲(CIDR與NAT)
TCP-IP協議詳解(15) 先生,要點單嗎?(HTTP協議概覽)
如果上述文章的知識都有所瞭解,那麼原理性的東西我們差不多都似懂非懂了。接下來,我們需要的是實戰。恩,接下來實現一下如下的網路程式吧。
1、實現一個簡單的一問一答的伺服器/客戶機模型。
2、用多進程/線程的方式實現一個伺服器同時為多個用戶端服務的程式(阻塞式的網路程式)。
3、實現一個基於事件驅動的伺服器網路程式(如Linux epoll)(非同步非阻塞網路程式)。
如果以上事情都做完了,接下來,精彩繼續!在Nginx風靡全球之際,每個人都難免好奇,去一探究竟。下面是幾個相當好的學習Nginx的精華文章匯總!
Nginx學習資源匯總
最後,電腦網路相關的兩篇不該錯過的好文章:
TCP 的那些事兒(上)
TCP 的那些事兒(下)