計算機網路——TCP/IP
都是下一層給上一層提供服務的。
(1)應用層專注於為使用者提供應用功能,不用關心資料如何傳輸。
(2)傳輸層負責應用到應用的通訊。在傳輸層上,如果資料包的大小超過MSS(TCP最大報文段長度),就要將資料包分塊。這樣即使中途有一個分塊丟失或損壞,只需要重新這一個分塊,而不用重新發送整個資料包。
(3)網路層負責將資料從一個裝置傳輸到另一個裝置(IP協議進行定址,告訴我們去往下一個目的地該朝著哪個方向走,路由是根據下一個目的地選擇路徑)。在網路層上,如果IP報文大小超過MTU(乙太網中一般為1500位元組)就會再次進行分片,得到一個即將傳送到網路的IP報文。
補充:TCP協議和UDP協議的分片方式不同。TCP的資料大小如果大於MSS大小,會在傳輸層進行分片,目標主機收到後,也同樣在傳輸層組裝資料包。如果中途丟失一個分片,只需要傳輸丟失的這個分片。UDP的資料大小如果大於MTU大小,則會在IP層進行分片,目標主機收到之後,在IP層組裝完資料,接著傳給傳輸層。但是如果中途丟失一個分片,實現可靠傳輸的UDP時就需要重傳所有的資料包,這樣傳輸效率非常差。所以通常UDP的報文應該小於MTU。
(4)資料鏈路層服務網路層,實現跨網路傳輸(有一個裝置同時在兩個網路中就是路由器)。每個網絡卡都有MAC地址,路由器計算下一個目的地IP後,再通過ARP協議找到目的地MAC,就可以知道要傳到哪個裝置。
(5)物理層實現裝置和網路之間的資料傳送。比如從裝置傳送到網路,要把資料包轉換成電訊號,讓其可以在物理介質中傳輸。
標誌位(控制位)有ACK/RST/SYN/FIN。序列號。確認應答號。
三次握手:
標誌位(控制位)SYN和ASK,序列號seq(隨機生成),應答號ask(下一次期望收到資料的序列號)
一開始客戶端是close,然後傳送標誌位SYN,傳送序列號之後變成SYN_SEND,然後接收伺服器發來的應答就變成ESTABLISH。
三次握手是為了保證通訊雙方都具有接收和傳送的能力。更重要的是防止歷史連線的建立、減少雙方不必要的資源開銷,幫助雙方同步初始化序列號。詳細原因如下:
(1)主要為了防止已經失效的連線請求報文段突然又傳輸到了服務端,導致產生問題。確認應答號是指下一次期望收到的資料的序列號。客戶端傳送多次SYN去建立連線,舊報文90比新報文100先到達服務端。服務端返回ACK,客戶端通過上下文比較,發現自己期望收到的ACK應該是100+1,於是發起RST報文終止連線。
客戶端判斷後,如果是舊歷史連線就要終止連線。如果只有兩次握手就不能終止連線。
(2)同步雙方的初始化序列號。
(3)避免資源的浪費。服務端收到客戶端都會發送應答,客戶端多次阻塞就會建立很多很多連線。
四次揮手:
一開始客戶端和伺服器都是ESTABLISH。客戶端先向伺服器發出連線釋放報文段FIN=1/seq=x,並且停止再發送資料,主動關閉TCP連線,進入FIN_WAIT1的狀態。伺服器收到連線釋放報文段以後就傳送應答標誌位和應答訊號,服務端進入CLOSE_WAIT的等待關閉狀態,此時TCP處於半關閉的狀態,客戶端不能再發資料給伺服器(但客戶端可能還有資料要傳送)
客戶端收到伺服器的應答之後,進入FIN-WAIT2狀態,等待伺服器發出的連線釋放報文段。
伺服器傳送完應答資料之後,就會再次傳送連線釋放報文段(此時應答標誌位和應答訊號和前面一樣?)伺服器進入LAST_ACK最後確認的狀態,等待A的確認。客戶端收到伺服器的連線釋放訊號以後,進入TIME_WAIT的狀態,此時TCP沒有完全釋放,伺服器依舊可以向客戶端傳送,等到2msl,客戶端才進入CLOSE狀態。伺服器收到客戶端傳送的確認報文段後關閉連線,如果沒有收到,就會重傳連線釋放訊號。
2msl是為了保證客戶端最後傳送的確認報文段能夠到達伺服器,如果丟失了伺服器還會重傳連線釋放訊號。此外,2msl還可以防止已經失效的連線釋放報文段再次出現在本連線中。客戶端在傳送最後一個應答訊號之後,再經過2msl,就可以使得這個連線所產生的所有報文段都從網路中消失。
為什麼要四次揮手?因為一開始是客戶端要釋放連線的,但是伺服器不知道,可能這時候伺服器還有要傳送給客戶端的東西。所以伺服器在收到客戶端的釋放要求之後,先應答一下,等到伺服器把想傳送的都發送完了之後,再跟客服端傳送關閉訊號,使得客戶端關閉(TIME_WAIT)。然後客戶端應答,然後伺服器徹底關閉。
TCP的特點有哪些?TCP是面向連線的傳輸層協議,而且他是點對點的,能夠提供可靠交付的服務,提供全雙工的通訊,面向的是位元組流。
TCP和UDP的不同。TCP是面向連線的,而UDP在傳送資料之前,不需要建立連線。TCP是可靠的,而UDP不提供可靠交付。TCP面向位元組流,而UDP面向報文。TCP有擁塞控制,而UDP沒有,因此網路擁塞不會引起傳送端速率降低,很適合在傳輸視訊會議。TCP只能點到點,而UDP都可以。TCP首部開銷20位元組,而UDP只有8位元組。