操作系統:(Operating System,簡稱OS)是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在“裸機”上的最基本的系統軟件,任何其他軟件都必須在操作系統的支持下才能運行。
注:計算機(硬件)---->OS----->應用軟件
基本組成:
速率
帶寬
吞吐量
時延
發送時延
傳播時延
排隊時延和處理時延
時延帶寬積
往返時間
表示從發送端發送數據開始,到發送端接收到來自接收端的確認(發送端收到確認立即發送確認),總共經歷的時間;
利用率
協議: 是網絡中計算機或設備之間進行通信的一系列規則的集合。網絡協議的作用主要有兩個:一是建立對等層之間的虛擬通信,二是實現層次之間的無關性。
協議棧: 在網絡中,為了完成通信,必須使用多層上的多種協議。這些協議按照層次順序組合在一起,構成了協議棧(Protocol Stack),也稱為協議族(Protocol Suite)。
層次間的無關性: 所謂層次間無關性,就是指較高層次和相鄰的相低層次進行通信時,只是利用較低層次提供的接口和服務,而不需了解底層實現該功能所采用的算法和協議的細節;較低層次也僅是使用從高層系統傳送來的參數和控制信息,這就是層次間的無關性。
(1)底層的物理連接介質,是為通信鋪好道路的
(2)一套統一的通信標準---->互聯網通信協議(計算機界的英語)
互聯網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層
用戶感知到的只是最上面一層應用層,自上而下每層都依賴于下一層,所以我們從最下一層開始切入,比較好理解
用戶在用戶層輸入命令(數據),到傳輸層包上tcp協議頭,再到網絡層包裹上ip頭,再到數據鏈路層包上以太網頭,通過client物理層經過線路被server物理層接收,然后一層層反解到server的應用層,server應用層拿到命令后請求操作系統去調用硬盤里面的數據,最后再返回到數據層。
數據(可以加http協議等)----》傳輸層(包上tcp/udp協議)----》網絡層(包上ip協議)----》數據鏈接層(包上以太網協議)----》物理層
底層物理連接介質。負責發送電信號高電壓對應數字1,低電壓對應數字0。兩個物理層通過光纜電纜雙絞纜等介質連接
數據鏈路層的功能:定義了電信號的分組方式
ethernet規定
一組電信號構成一個數據包,叫做‘幀’
每一數據幀分成:報頭head(固定18個字節)和數據data兩部分
數據包的具體內容
head長度+data長度=最短64字節,最長1518字節,超過最大限制就分片發送
mac地址(網卡的地址,接入internet的設備都必須有網卡,即可找到某個具體的設備):
head中包含的源和目標地址由來:ethernet規定接入internet的設備都必須具備網卡,發送端和接收端的地址便是指網卡的地址,即mac地址
廣播:
有了mac地址,同一網絡內的兩臺主機就可以通信了(一臺主機通過arp協議獲取另外一臺主機的mac地址,該主機再回應時就不用吼了,交換機的‘學習’特性)
pc1通過廣播方式發送以太網包給pc2,pc3,pc4,pc5,大家收到pc1發來的包,拆開后如果發現不是自己的就丟棄,是自己的就響應,并返回給pc1自己的mac地址。
網絡層功能: 引入一套新的地址用來區分不同的廣播域/子網,這套地址即網絡地址
IP協議:
規定網絡地址的協議叫ip協議,它定義的地址稱之為ip地址,廣泛采用的v4版本即ipv4,它規定網絡地址由32位2進制表示
范圍0.0.0.0-255.255.255.255
一個ip地址通常寫成四段十進制數,例:172.16.10.1
標識地址的方式:
ip+mac就能標識全世界范圍內獨一無二的一臺計算機
ip+mac+port就能標識全世界范圍內獨一無二的一個基于網絡通信的應用軟件
url地址:標識全世界范圍內獨一無二的一個資源
ARP協議:
arp協議功能:廣播的方式發送數據包,獲取目標主機的mac地址
協議工作方式:每臺主機ip都是已知的
例如:主機172.16.10.10/24訪問172.16.10.11/24
一:首先通過ip地址和子網掩碼區分出自己所處的子網,子網掩碼固定為255.255.255.0(1111 1111.1111 1111.1111 1111.0000 0000),即取ip的前三段,以此判斷是不是在同一個子網
場景 數據包地址
同一子網 目標主機mac,目標主機ip
不同子網 網關mac,目標主機ip
二:分析172.16.10.10/24與172.16.10.11/24處于同一網絡(如果不是同一網絡,那么下表中目標ip為172.16.10.1,通過arp獲取的是網關的mac)
源mac 目標mac 源ip 目標ip 數據部分
發送端主機 發送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 數據
三:這個包會以廣播的方式在發送端所處的自網內傳輸,所有主機接收后拆開包,發現目標ip為自己的,就響應,返回自己的mac
傳輸層的由來: 網絡層的ip幫我們區分子網,以太網層的mac幫我們找到主機,然后大家使用的都是應用程序,你的電腦上可能同時開啟qq,暴風影音,等多個應用程序,那么我們通過ip和mac找到了一臺特定的主機,如何標識這臺主機上的應用程序,答案就是端口,端口即應用程序與網卡關聯的編號。
傳輸層功能: 建立端口到端口的通信
補充: 端口范圍0-65535,0-1023為系統占用端口,1024-65535給軟件用
tcp協議(可靠傳輸):
以太網頭-------ip 頭---------tcp頭---------數據
udp協議(不可靠傳輸):
以太網頭-------ip 頭---------udp頭---------數據
注意: MAC地址由48位二進制數組成,在Windows操作系統命令提示符下, 輸入"ipconfig / all"能夠看到計算機網卡的MAC地址,物理地址… : C8-60-00-2E-6E-EB,這里顯示的是十六進制表示的MAC地址,使用MA和MB代替MAC地址是為了簡化說明。
目標MAC地址決定了數據幀下一跳由哪個設備接收;
目標IP地址決定了數據包最終到達那個計算機;
不同的網絡數據鏈路層使用不同的協議,幀格式也不相同,路由器在不同網絡轉發數據包,需要將數據包重新封裝;
數據封裝和解封(數據傳輸)
網絡通信協議的作用是負責在網絡上建立通信通道和控制通過通道的信息流的規則。為了進行網絡通信,通信雙方必須遵守通信協議
Telnet協議
Telnet是TCP/IP中的一種應用協議,可以為終端仿真提供支持。可使用戶連接到主機上,使主機響應起來就像它直接連接在終端上一樣。Telnet在發送端和接收端使用TCP的23號端口以進行專用的通信。
FTP協議
FTP協議使用TCP20號和21號端口,20號端口用于數據交換,21號端口用于建立連接,允許目錄和文件訪問,上傳下載,不能遠程執行文件。
TFTP是簡單文件傳輸協議(Trivial File Transfer Protocol,TFTP),TFTP是無連接的,使用UDP的69號端口,用于當數據傳輸錯誤無關緊要而且無須安全性時的小型文件的傳輸。
SMTP協議
SMTP是簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)是為網絡系統間的電子郵件交換而設計的。使用 25 端口。SMTP只需要在接收端的一個電子郵件地址即可發送郵件。POP3 協議用來接收郵件.使用110端口
DNS服務
DNS是域名解析服務(Domain Name Service, DNS),作用是將域名轉換為IP地址,或將IP地址轉換為域名,用于解析完全合格域名(FQDN)。使用53號端口。
序列號seq: 占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號后,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。
確認號ack: 占4個字節,期待收到對方下一個報文段的第一個數據字節的序號;序列號表示報文段攜帶數據的第一個字節的編號;而確認號指的是期望接收到下一個字節的編號;因此當前報文段最后一個字節的編號+1即為確認號。
確認ACK: 占1位,僅當ACK=1時,確認號字段才有效。ACK=0時,確認號無效
同步SYN: 連接建立時用于同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。SYN這個標志位只有在TCP建產連接時才會被置1,握手完成后SYN標志位被置0。
終止FIN: 用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,并要求釋放運輸連接
源端口號: 表示發送端端口號,字段長為16位。
目標端口號: 表示接收端口號,字段長為16位。
首部長度: 該字段長度為4位,單位為4字節(32位)。TCP首部長度不包括選項的話,是20個字節,20/4=5,5的二進制序列:0101,報頭長度也叫數據偏移,所以該字段可以設置為5,選項字段最大的是40字節,所以,TCP首部長度為最大為20+40=60字節,該字段可以設置的最大長度為60/4=15。
保留: 該字段主要是為了以后擴展時使用,其長度為4位。一般設置為0,即使收到的包在該字段不為0,此包也不會丟棄。
控制位: 字段長為6,每一位從左到右分別為:URG、ACK、PSH、RST、SYN、FIN。當對應的值為1,表示有具體含義。
窗口大小: 接收緩沖區的大小,TCP不允許發送超過此處所示大小的數據。
校驗和: 發送端填充,CRC校驗,接收校驗不通過,則認為數據有問題。和UDP的區別是,UDP校驗的是數據本身,TCP校驗的不僅包含TCP首部,而且包含TCP數據部分。
緊急指針: 只有在URG為1時有效,該字段為1表示本報文的段中的緊急數據的指針。
選項: 用于提高TCP的傳輸性能。需要根據首部長度進行控制,其最大長度為40字節。
第一次握手: 建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
第二次握手: 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手: 客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
1)客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。
2)服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
3)客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。
4)服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。
5)客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。
6)服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
MSL即Maximum Segment Lifetime,就是最大報文生存時間,是任何報文在網絡上的存在的最長時間,超過這個時間報文將被丟棄。《TCP/IP詳解》中是這樣描述的:MSL是任何報文段被丟棄前在網絡內的最長時間。RFC 793中規定MSL為2分鐘,實際應用中常用的是30秒、1分鐘、2分鐘等。
TCP的TIME_WAIT需要等待2MSL,當TCP的一端發起主動關閉,三次揮手完成后發送第四次揮手的ACK包后就進入這個狀態,等待2MSL時間主要目的是:防止最后一個ACK包對方沒有收到,那么對方在超時后將重發第三次握手的FIN包,主動關閉端接到重發的FIN包后可以再發一個ACK應答包。在TIME_WAIT狀態時兩端的端口不能使用,要等到2MSL時間結束才可以繼續使用。當連接處于2MSL等待階段時任何遲到的報文段都將被丟棄。
我們來分析一種特殊情況,假設客戶端請求建立連接,發給服務器SYN包等待服務器確認,服務器收到確認后,如果是兩次握手,假設服務器給客戶端在第二次握手時發送數據,數據從服務器發出,服務器認為連接已經建立,但在發送數據的過程中數據丟失,客戶端認為連接沒有建立,會進行重傳。假設每次發送的數據一直在丟失,客戶端一直SYN,服務器就會產生多個無效連接,占用資源,這個時候服務器可能會掛掉。這個現象就是我們聽過的“SYN的洪水攻擊”。
總結:第三次握手是為了防止:如果客戶端遲遲沒有收到服務器返回確認報文,這時會放棄連接,重新啟動一條連接請求,但問題是:服務器不知道客戶端沒有收到,所以他會收到兩個連接,浪費連接開銷。如果每次都是這樣,就會浪費多個連接開銷。
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75秒鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接。
雙方關閉連接要經過雙方都同意。所以,首先是客服端給服務器發送FIN,要求關閉連接,服務器收到后會發送一個ACK進行確認。服務器然后再發送一個FIN,客戶端發送ACK確認,并進入TIME_WAIT狀態。等待2MSL后自動關閉。
總結:
(1)為了保證客戶端發送的最后一個ACK報文段能夠到達服務器。即最后一個確認報文可能丟失,服務器會超時重傳,然后服務器發送FIN請求關閉連接,客戶端發送ACK確認。一個來回是兩個報文生命周期。
如果沒有等待時間,發送完確認報文段就立即釋放連接的話,服務器就無法重傳,因此也就收不到確認,就無法按步驟進入CLOSED狀態,即必須收到確認才能close。
(2)防止已經失效的連接請求報文出現在連接中。經過2MSL,在這個連續持續的時間內,產生的所有報文段就可以都從網絡消失。