網絡班第八周
1.簡述osi七層模型和TCP/IP五層模型

在制定計算機網絡標準方面,起著重大作用的兩大國際組織是:國際電信聯盟電信標準化部門,與國際標準組織(ISO),雖然它們工作領域不同,但隨著科學技術的發展,通信與信息處理之間的界限開始變得比較模糊,這也成了國際電信聯盟電信標準化部門和ISO共同關心的領域。1984年,ISO發布了著名的OSI(Open System Interconnection)標準,它定義了網絡互聯的7層框架,物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層),即OSI開放系統互連參考模型。
雖然OSI是國際標準,但是它并沒有成功通用的,TCP/IP協議較為常用
OSI七層模型
OSI定義了網絡互聯的七層模型(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層),如下圖所示:

第7層 應用層
應用層(Application Layer)提供為應用軟件而設的接口,以設置與另一應用軟件之間的通信。例如:HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等
第6層 表示層
主條目:表示層(Presentation Layer)把數據轉換為能與接收者的系統格式兼容并適合傳輸的格式
第5層 會話層
會話層(Session Layer)負責在數據傳輸中設置和維護電腦網絡中兩臺電腦之間的通信連接。
第4層 傳輸層
傳輸層(Transport Layer)把傳輸表頭(TH)加至數據以形成數據包。傳輸表頭包含了所使用的協議等發送信息。例如:傳輸控制協議(TCP)等。
第3層 網絡層
網絡層(Network Layer)決定數據的路徑選擇和轉寄,將網絡表頭(NH)加至數據包,以形成報文。網絡表頭包含了網絡數據。例如:互聯網協議(IP)等。
第2層 數據鏈接層
數據鏈路層(Data Link Layer)負責網絡尋址、錯誤偵測和改錯。當表頭和表尾被加至數據包時,會形成信息框(Data Frame)。數據鏈表頭(DLH)是包含了物理地址和錯誤偵測及改錯的方法。數據鏈表尾(DLT)是一串指示數據包末端的字符串。例如以太網、無線局域網(Wi-Fi)和通用分組無線服務(GPRS)等。分為兩個子層:邏輯鏈路控制(logical link control,LLC)子層和介質訪問控制(Media access control,MAC)子層
第1層 物理層
物理層(Physical Layer)在局部局域網上傳送數據幀(Data Frame),它負責管理電腦通信設備和網絡媒體之間的互通。包括了針腳、電壓、線纜規范、集線器、中繼器、網卡、主機接口卡等
TCP/IP五層模型
Transmission Control Protocol/Internet Protocol 傳輸控制協議/因特網互聯協議
TCP/IP是一個Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等許多協議
最早發源于1969年美國國防部(縮寫為DoD)的因特網的前身ARPA網項目,1983年1月1日,TCP/IP取代了舊的網絡控制協議NCP,成為今天的互聯網和局域網的基石和標準,由互聯網工程任務組負責維護 TCP/IP是一組協議的代名詞,它包括許多協議,組成了TCP/IP協議簇。它是把OSI七層模型簡化成了五層模型。每一層都呼叫它的下一層所提供的網絡來完成自己的需求。

TCP/IP和OSI模型的比較
相同點
兩者都是以協議棧的概念為基礎
協議棧中的協議彼此相互獨立
下層對上層提供服務
不同點
OSI是先有模型;TCP/IP是先有協議,后有模型
OSI是國際標準,適用于各種協議棧;TCP/IP實際標準,只適用于TCP/IP網絡
層次數量不同
2.總結描述TCP三次握手四次揮手
TCP包頭結構

源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個,即65536
序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由于序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從0 開始
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送方:我希望你(指發送方)下次發送的數據的第一個字節數據的編號為此確認號數據偏移:表示TCP報文段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠。該字段的單位是32位(即4個字節為計算單位),4位二進制最大表示15,所以數據偏移也就
是TCP首部最大60字節
URG:表示本報文段中發送的數據是否包含緊急數據。后面的緊急指針字段(urgent pointer)只有當URG=1時才有效
ACK:表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段
PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀走,就會一直停留在TCP接收緩沖區中
RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段
SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段
FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結束報文段
窗口大小:表示現在允許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量,達到此值,需要ACK確認后才能再繼續傳送后面數據,由Window size value *Window size scaling factor(此值在三次握手階段TCP選項Window scale協商得到)得出此值
校驗和:提供額外的可靠性
緊急指針:標記緊急數據在數據字段中的位置
選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節
SYN ,ACK,Seq的關系
SYN(synchronous): 建立連接
ACK(acknowledgement): 確認
SEQ(sequence):順序編號
TCP連接的建立(三次握手)

最開始的時候客戶端和服務器都是處于CLOSED狀態。主動打開連接的為客戶端,被動打開連接的是服務器。
1)TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;
2)TCP客戶進程也是先創建傳輸控制塊TCB,然后向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。
3)TCP服務器收到請求報文后,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。
4)TCP客戶進程收到確認后,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。
5)當服務器收到客戶端的確認后也進入ESTABLISHED狀態,此后雙方就可以開始通信了。
TCP連接的釋放(四次揮手)

數據傳輸完畢后,雙方都可釋放連接。最開始的時候,客戶端和服務器都是處于ESTABLISHED狀態,然后客戶端主動關閉,服務器被動關閉。
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連接的時間要比客戶端早一些。
常見面試題
【問題1】為什么連接的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
【問題2】為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最后的ACK回復,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重復發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之后進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那么Client會重發ACK并再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回復所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那么Client推斷ACK已經被成功接收,則結束TCP連接。
【問題3】為什么不能用兩次握手進行連接?
答:3次握手完成兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被發送和確認。
現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作為例子,考慮計算機S和C之間的通信,假定C給S發送一個連接請求分組,S收到了這個分組,并發 送了確認應答分組。按照兩次握手的協定,S認為連接已經成功地建立了,可以開始發送數據分組。可是,C在S的應答分組在傳輸中被丟失的情況下,將不知道S 是否已準備好,不知道S建立什么樣的序列號,C甚至懷疑S是否收到自己的連接請求分組。在這種情況下,C認為連接還未建立成功,將忽略S發來的任何數據分 組,只等待連接確認應答分組。而S在發出的分組超時后,重復發送同樣的分組。這樣就形成了死鎖。
【問題4】如果已經建立了連接,但是客戶端突然出現故障了怎么辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75秒鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接
3.描述TCP和UDP區別
TCP特性
工作在傳輸層
面向連接協議
全雙工協議
半關閉
錯誤檢查
將數據打包成段,排序
確認機制
數據恢復,重傳
流量控制,滑動窗口
擁塞控制,慢啟動和擁塞避免算法
更多關于tcp的內核參數,可參看man 7 tcp
TCP的特點
1)
TCP不提供廣播或多播服務。每一條 TCP 連接只能有兩個端點(endpoint),
每一條TCP 連接只能是點對點的(一對一)。
2)
TCP 根據對方給出的窗口值和當前網絡擁塞的程度來決定一個報文段應
包含多少個字節(UDP 發送的報文長度是應用進程給-出的)。
3)
TCP 可把太長的數據塊劃分短一些再傳送。
TCP也可等待積累有足夠多的字節后再構成報文段發送出去。
4)
在發送完一個分組后,必須暫時保留已發送的分組的副本。
5)
分組和確認分組都必須進行編號。
6)
超時計時器的重傳時間應當比數據在分組傳輸的平均往返時間更長一些。
7)
這種可靠傳輸協議常稱為自動重傳請求ARQ (Automatic Repeat reQuest)。
ARQ 表明重傳的請求是自動進行的。接收方不-需要請求發送方重傳某個出錯的分組 。
8)
累積確認。
接收方一般采用累積確認的方式。即不必對收到的分組逐個發送確認,
而是對按序到達的最后一個分組發送確認,這樣就表示:到這個分組為止的所有分組都已正確收到了。累積確認有的優點是:容易實現,即使確認丟失也不必重傳。
缺點是:不能向發送方反映出接收方已經正確收到的所有分組的信息。
9)
TCP中發送緩存和接收緩存的作用
發送緩存存放:發送應用程序傳送給發送方TCP準備發送的數據;
TCP已發送出但尚未收到確認的數據。
接收緩存存放:按序到達的、但尚未被接收應用程序讀取的數據;
不按序到達的數據。
UDP特性
工作在傳輸層
提供不可靠的網絡訪問
非面向連接協議
有限的錯誤檢查
傳輸性能高
無數據恢復特性
更多關于udp的內核參數,可參看man 7 udp
UPD的特點
1)
UDP 是無連接的,即發送數據之前不需要建立連接。
2)
UDP 使用盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制。
3)
UDP 是面向報文的。UDP 沒有擁塞控制,很適合多媒體通信的要求。
4)
UDP 支持一對一、一對多、多對一和多對多的交互通信。
5)
UDP 的首部開銷小,只有 8個字節。
6)
發送方 UDP 對應用程序交下來的報文,在添加首部后就向下交付 IP 層。UDP 對應用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界。應用層交給UDP多長的報文,UDP 就照樣發送,即一次發送一個報文。接收方 UDP 對 IP 層交上來的 UDP用戶數據報,在去除首部后就原封不動地交付上層的應用進程,一次交付一個完整的報文。應用程序必須選擇合適大小的報文。
TCP與UDP區別

1)
TCP面向連接;
UDP是無連接的,即發送數據之前不需要建立連接
2)
TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;
UDP盡最大努力交付,即不保證可靠交付
3)
TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;
UDP是面向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4)
每一條TCP連接只能是點到點的
UDP支持一對一,一對多,多對一和多對多的交互通信
5)
TCP首部開銷20字節
DP的首部開銷小,只有8個字節
6)
TCP的邏輯通信信道是全雙工的可靠信道
UDP則是不可靠信道
浙公網安備 33010602011771號