作者:奔跑吧牛客
鏈接:https://www.nowcoder.com/discuss/1937
來源:牛客網
可以參考的文章
OSI,TCP/IP,五層協議的體系結構,以及各層協議
OSI分層 (7層):物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。物理層:通過媒介傳輸比特,確定機械及電氣規范(比特Bit)
數據鏈路層:將比特組裝成幀和點到點的傳遞(幀Frame)。點對點的協議PPP。三個基本問題:封裝成幀、透明傳輸、差錯檢測。
網絡層:負責數據包從源到宿的傳遞和網際互連(包PackeT)
傳輸層:提供端到端的可靠報文傳遞和錯誤恢復(段Segment)
會話層:建立、管理和終止會話(會話協議數據單元SPDU)
表示層:對數據進行翻譯、加密和壓縮(表示協議數據單元PPDU)
應用層:允許訪問OSI環境的手段(應用協議數據單元APDU)
IP地址的分類
A類地址:以0開頭, 第一個字節范圍:0~127(1.0.0.0 - 126.255.255.255);
B類地址:以10開頭, 第一個字節范圍:128~191(128.0.0.0 - 191.255.255.255);
C類地址:以110開頭, 第一個字節范圍:192~223(192.0.0.0 - 223.255.255.255);
10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用於內部)
IP地址與子網掩碼相與得到主機號(子網掩碼的作用)
ARP是地址解析協議,簡單語言解釋一下工作原理。
1:首先,每個主機都會在自己的ARP緩沖區中建立一個ARP列表,以表示IP地址和MAC地址之間的對應關系。
2:當源主機要發送數據時,首先檢查ARP列表中是否有對應IP地址的目的主機的MAC地址,如果有,則直接發送數據,如果沒有,就向本網段的所有主機發送ARP數據包,該數據包包括的內容有:源主機 IP地址,源主機MAC地址,目的主機的IP 地址。
3:當本網絡的所有主機收到該ARP數據包時,首先檢查數據包中的IP地址是否是自己的IP地址,如果不是,則忽略該數據包,如果是,則首先從數據包中取出源主機的IP和MAC地址寫入到ARP列表中,如果已經存在,則覆蓋,然后將自己的MAC地址寫入ARP響應包中,告訴源主機自己是它想要找的MAC地址。
4:源主機收到ARP響應包后。將目的主機的IP和MAC地址寫入ARP列表,並利用此信息發送數據。如果源主機一直沒有收到ARP響應數據包,表示ARP查詢失敗。
廣播發送ARP請求,單播發送ARP響應。
各種協議
ICMP協議: 因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。
TFTP協議: 是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。
HTTP協議: 超文本傳輸協議,是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。
DHCP協議: 動態主機配置協議,是一種讓系統得以連接到網絡上,並獲取所需要的配置參數手段。
NAT協議:網絡地址轉換屬接入廣域網(WAN)技術,是一種將私有(保留)地址轉化為合法IP地址的轉換技術,
DHCP協議:一個局域網的網絡協議,使用UDP協議工作,用途:給內部網絡或網絡服務供應商自動分配IP地址,給用戶或者內部網絡管理員作為對所有計算機作中央管理的手段。
描述:RARP
RARP是逆地址解析協議,作用是完成硬件地址到IP地址的映射,主要用於無盤工作站,因為給無盤工作站配置的IP地址不能保存。工作流程:在網絡中配置一台RARP服務器,里面保存着IP地址和MAC地址的映射關系,當無盤工作站啟動后,就封裝一個RARP數據包,里面有其MAC地址,然后廣播到網絡上去,當服務器收到請求包后,就查找對應的MAC地址的IP地址裝入響應報文中發回給請求者。因為需要廣播請求報文,因此RARP只能用於具有廣播能力的網絡。
ICMP(網際控制報文協議):有兩種:差錯控制報文 詢問報文
ICMP 是 Internet Control Message Protocol ,因特網控制報文協議。它是 TCP/IP 協議族的一個子協議,用於在 IP 主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由器是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。
PING就是應用層直接調用運輸層的例子,沒有經過TCP 或者UDP.
TCP的可靠性如何保證:
在TCP的連接中,數據流必須以正確的順序送達對方。TCP的可靠性是通過順序編號和確認(ACK)來實現的。TCP在開始傳送一個段時,為准備重傳而首先將該段插入到發送隊列之中,同時啟動時鍾。其后,如果收到了接受端對該段的ACK信息,就將該段從隊列中刪去。如果在時鍾規定的時間內,ACK未返回,那么就從發送隊列中再次送出這個段。TCP在協議中就對數據可靠傳輸做了保障,握手與斷開都需要通訊雙方確認,數據傳輸也需要雙方確認成功,在協議中還規定了:分包、重組、重傳等規則;而UDP主要是面向不可靠連接的,不能保證數據正確到達目的地。
TCP三次握手和四次揮手的全過程
三次握手:
第一次握手:客戶端發送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,至此,完成四次揮手。
在瀏覽器中輸入www.baidu.com后執行的全部過程
1、客戶端瀏覽器通過DNS解析到www.baidu.com的IP地址220.181.27.48,通過這個IP地址找到客戶端到服務器的路徑。客戶端瀏覽器發起一個HTTP會話到220.161.27.48,然后通過TCP進行封裝數據包,輸入到網絡層。
2、在客戶端的傳輸層,把HTTP會話請求分成報文段,添加源和目的端口,如服務器使用80端口監聽客戶端的請求,客戶端由系統隨機選擇一個端口如5000,與服務器進行交換,服務器把相應的請求返回給客戶端的5000端口。然后使用IP層的IP地址查找目的端。
3、客戶端的網絡層不用關系應用層或者傳輸層的東西,主要做的是通過查找路由表確定如何到達服務器,期間可能經過多個路由器,這些都是由路由器來完成的工作,我不作過多的描述,無非就是通過查找路由表決定通過那個路徑到達服務器。
4、客戶端的鏈路層,包通過鏈路層發送到路由器,通過鄰居協議查找給定IP地址的MAC地址,然后發送ARP請求查找目的地址,如果得到回應后就可以使用ARP的請求應答交換的IP數據包現在就可以傳輸了,然后發送IP數據包到達服務器的地址。
TCP和UDP的區別?
TCP提供面向連接的、可靠的數據流傳輸,而UDP提供的是非面向連接的、不可靠的數據流傳輸。
TCP傳輸單位稱為TCP報文段,UDP傳輸單位稱為用戶數據報。
TCP注重數據安全性,UDP數據傳輸快,因為不需要連接等待,少了許多操作,但是其安全性卻一般。
TCP對應的協議和UDP對應的協議
TCP對應的協議:
(1) FTP:定義了文件傳輸協議,使用21端口。
(2) Telnet:一種用於遠程登陸的端口,使用23端口,用戶可以以自己的身份遠程連接到計算機上,可提供基於DOS模式下的通信服務。
(3) SMTP:郵件傳送協議,用於發送郵件。服務器開放的是25號端口。
(4) POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110端口。
(5)HTTP:是從Web服務器傳輸超文本到本地瀏覽器的傳送協議。
UDP對應的協議:
(1) DNS:用於域名解析服務,將域名地址轉換為IP地址。DNS用的是53號端口。
(2) SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。由於網絡設備很多,無連接的服務就體現出其優勢。
(3) TFTP(Trival File Tran敏感詞er Protocal),簡單文件傳輸協議,該協議在熟知端口69上使用UDP服務。
DNS域名系統,簡單描述其工作原理。
當DNS客戶機需要在程序中使用名稱時,它會查詢DNS服務器來解析該名稱。客戶機發送的每條查詢信息包括三條信息:包括:指定的DNS域名,指定的查詢類型,DNS域名的指定類別。基於UDP服務,端口53. 該應用一般不直接為用戶使用,而是為其他應用服務,如HTTP,SMTP等在其中需要完成主機名到IP地址的轉換。
面向連接和非面向連接的服務的特點是什么?
面向連接的服務,通信雙方在進行通信之前,要先在雙方建立起一個完整的可以彼此溝通的通道,在通信過程中,整個連接的情況一直可以被實時地監控和管理。
非面向連接的服務,不需要預先建立一個聯絡兩個通信節點的連接,需要通信的時候,發送節點就可以往網絡上發送信息,讓信息自主地在網絡上去傳,一般在傳輸的過程中不再加以監控。
TCP的三次握手過程?為什么會采用三次握手,若采用二次握手可以嗎?
答:建立連接的過程是利用客戶服務器模式,假設主機A為客戶端,主機B為服務器端。
(1)TCP的三次握手過程:主機A向B發送連接請求;主機B對收到的主機A的報文段進行確認;主機A再次對主機B的確認進行確認。
(2)采用三次握手是為了防止失效的連接請求報文段突然又傳送到主機B,因而產生錯誤。失效的連接請求報文段是指:主機A發出的連接請求沒有收到主機B的確認,於是經過一段時間后,主機A又重新向主機B發送連接請求,且建立成功,順序完成數據傳輸。考慮這樣一種特殊情況,主機A第一次發送的連接請求並沒有丟失,而是因為網絡節點導致延遲達到主機B,主機B以為是主機A又發起的新連接,於是主機B同意連接,並向主機A發回確認,但是此時主機A根本不會理會,主機B就一直在等待主機A發送數據,導致主機B的資源浪費。
(3)采用兩次握手不行,原因就是上面說的實效的連接請求的特殊情況。
擁塞控制的幾種方法:
慢開始、擁塞避免、快重傳。
一般原理:發生擁塞控制的原因:資源(帶寬、交換節點的緩存、處理機)的需求 > 可用資源。作用:擁塞控制就是為了防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或者鏈路不至於過載。擁塞控制要做的都有一個前提:就是網絡能夠承受現有的網絡負荷。對比流量控制:擁塞控制是一個全局的過程,涉及到所有的主機、路由器、以及降低網絡相關的所有因素。流量控制往往指點對點通信量的控制。是端對端的問題。
擁塞窗口:發送方為一個動態變化的窗口叫做擁塞窗口,擁塞窗口的大小取決於網絡的擁塞程度。發送方讓自己的發送窗口=擁塞窗口,但是發送窗口不是一直等於擁塞窗口的,在網絡情況好的時候,擁塞窗口不斷的增加,發送方的窗口自然也隨着增加,但是接受方的接受能力有限,在發送方的窗口達到某個大小時就不在發生變化了。
發送方如果知道網絡擁塞了呢?發送方發送一些報文段時,如果發送方沒有在時間間隔內收到接收方的確認報文段,則就可以人為網絡出現了擁塞。
慢啟動算法的思路:主機開發發送數據報時,如果立即將大量的數據注入到網絡中,可能會出現網絡的擁塞。慢啟動算法就是在主機剛開始發送數據報的時候先探測一下網絡的狀況,如果網絡狀況良好,發送方每發送一次文段都能正確的接受確認報文段。那么就從小到大的增加擁塞窗口的大小,即增加發送窗口的大小。
例子:開始發送方先設置cwnd(擁塞窗口)=1,發送第一個報文段M1,接收方接收到M1后,發送方接收到接收方的確認后,把cwnd增加到2,接着發送方發送M2、M3,發送方接收到接收方發送的確認后cwnd增加到4,慢啟動算法每經過一個傳輸輪次(認為發送方都成功接收接收方的確認),擁塞窗口cwnd就加倍。
擁塞避免:為了防止cwnd增加過快而導致網絡擁塞,所以需要設置一個慢開始門限ssthresh狀態變量(我也不知道這個到底是什么,就認為他是一個擁塞控制的標識),它的用法:
1. 當cwnd < ssthresh,使用慢啟動算法,
2. 當cwnd > ssthresh,使用擁塞控制算法,停用慢啟動算法。
3. 當cwnd = ssthresh,這兩個算法都可以。
擁塞避免的思路:是讓cwnd緩慢的增加而不是加倍的增長,每經歷過一次往返時間就使cwnd增加1,而不是加倍,這樣使cwnd緩慢的增長,比慢啟動要慢的多。
無論是慢啟動算法還是擁塞避免算法,只要判斷網絡出現擁塞,就要把慢啟動開始門限(ssthresh)設置為設置為發送窗口的一半(>=2),cwnd(擁塞窗口)設置為1,然后在使用慢啟動算法,這樣做的目的能迅速的減少主機向網絡中傳輸數據,使發生擁塞的路由器能夠把隊列中堆積的分組處理完畢。擁塞窗口是按照線性的規律增長,比慢啟動算法擁塞窗口增長塊的多。
實例:1.TCP連接進行初始化的時候,cwnd=1,ssthresh=16。
2.在慢啟動算法開始時,cwnd的初始值是1,每次發送方收到一個ACK擁塞窗口就增加1,當ssthresh =cwnd時,就啟動擁塞控制算法,擁塞窗口按照規律增長,
3.當cwnd=24時,網絡出現超時,發送方收不到確認ACK,此時設置ssthresh=12,(二分之一cwnd),設置cwnd=1,然后開始慢啟動算法,當cwnd=ssthresh=12,慢啟動算法變為擁塞控制算法,cwnd按照線性的速度進行增長。
AIMD(加法增大乘法減小)
1. 乘法減小:無論在慢啟動階段還是在擁塞控制階段,只要網絡出現超時,就是將cwnd置為1,ssthresh置為cwnd的一半,然后開始執行慢啟動算法(cwnd<ssthresh)。
2. 加法增大:當網絡頻發出現超時情況時,ssthresh就下降的很快,為了減少注入到網絡中的分組數,而加法增大是指執行擁塞避免算法后,是擁塞窗口緩慢的增大,以防止網絡過早出現擁塞。
這兩個結合起來就是AIMD算法,是使用最廣泛的算法。擁塞避免算法不能夠完全的避免網絡擁塞,通過控制擁塞窗口的大小只能使網絡不易出現擁塞。
快重傳:
快重傳算法要求首先接收方收到一個失序的報文段后就立刻發出重復確認,而不要等待自己發送數據時才進行捎帶確認。接收方成功的接受了發送方發送來的M1、M2並且分別給發送了ACK,現在接收方沒有收到M3,而接收到了M4,顯然接收方不能確認M4,因為M4是失序的報文段。如果根據可靠性傳輸原理接收方什么都不做,但是按照快速重傳算法,在收到M4、M5等報文段的時候,不斷重復的向發送方發送M2的ACK,如果接收方一連收到三個重復的ACK,那么發送方不必等待重傳計時器到期,由於發送方盡早重傳未被確認的報文段。
快恢復:
1. 當發送發連續接收到三個確認時,就執行乘法減小算法,把慢啟動開始門限(ssthresh)減半,但是接下來並不執行慢開始算法。
2. 此時不執行慢啟動算法,而是把cwnd設置為ssthresh的一半, 然后執行擁塞避免算法,使擁塞窗口緩慢增大。
Cookie和Session的區別和聯系:
二者的定義:
當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie里的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie來辨認使用者,以方便送出使用者量身定做的內容,像是 Web 接口的免費 email 網站,都要用到 Cookie。
具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。同時我們也看到,由於采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。cookie機制。正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后台自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為並不是規范規定的。若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存在內存里的cookie,不同的瀏覽器有不同的處理方式
session機制。session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
cookie 和session 的區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中