1、網絡七層協議包含,物理層、數據鏈路層、網絡層(ip協議)、傳輸層(TCP傳輸控制協議、UDP用戶數據報協議)、會話層、表示層、應用層(http協議)。是一個提供的概念架構協議。
2、TCP/IP協議,四層架構參考模型。包含鏈路層(物理層、數據鏈路層)、網絡層、傳輸層、應用層(會話層、表示層、應用層)。TCP/IP協議是協議群的統稱,其包含tcp、udp、ftp、Telnet、http等等,這些都屬於TCP/IP協議。TCP協議的特點:tcp是傳輸層協議,基於鏈接(點對點,即傳輸數據前需要創建好鏈接),雙工通信,可靠傳輸,擁塞控制,基於字節流而非報文。
3、傳輸控制協議TCP是什么?
TCP協議是傳輸層的協議。面向連接的、可靠的、基於字節流的傳輸層通信協議。將應用層的數據流分割成報文段並發送給目標節點的TCP層。數據包都有序號,對方收到則發送ack確認,未收到則重傳。使用校驗和來校驗數據在傳輸過程中是否有誤。
IP協議是無連接的通信協議,不會占用兩個正在通信的計算機之間的通信線路。ip降低了對網絡線路的需求,每條線可以同時滿足許多不同計算機之間的通信需要,通過ip消息或者其他數據會被分割為較小的獨立的包,並通過internet網在計算機之間進行傳送,ip負責將它的包路由到它的目的地,但是ip協議沒有做數據包是否按照順序發送,或者包是否被破壞,所以Ip數據包是不可靠的。需要由ip的上層協議做出控制。
4、何為TCP的三次握手?
當應用程序通過tcp和另一個應用程序進行通信的時候,它會發送一個通信請求,這個請求必須被送到一個確切的地址,在雙方握手之后,tcp將在兩個應用之間建立一個全雙工的通信,這個全雙工的通信將占用兩個計算機之間的通信線路,直到被一方或者雙方關閉為止。全雙工的含義就是計算機A可以給另一個計算機B發送信息,在發送信息的同時,而另一個計算機B也可以給計算機A回發信息。握手是為了建立連接,TCP三次握手的流程圖如下所示:
備注:TCP建連的三次握手,TCP是基於連接的(即TCP的三次握手是為了建立雙向的連接),所以在傳輸數據前需要建立連接。TCP是傳輸層協議,在傳輸上是全雙工傳輸,不區分客戶端Client和服務端Server的,為了便於理解,這里進行客戶端和服務端的划分,主動建連的一端稱為客戶端,被動建立連接的一端稱為服務器端。
4.1)、三次握手詳細介紹如下所示:
初始狀態:開始狀態客戶端和服務器都是CLOSE關閉狀態。當客戶端主動打開,服務器端被動打開。剛開始的時候TCP服務器進程先創建傳輸控制塊tcb,時刻准備接收其它進程發送過來的請求,此時服務器端進入Listen監聽狀態(即建立連接前server端需要監聽端口,此時服務器端進入Listen監聽狀態)。
1)、第一次握手:剛開始的時候TCP客戶端進程也是先創建傳輸控制塊tcb,向服務器發送連接請求報文,SYN=1,seq=x就是報文頭里面tcp flags 里面的同步序號SYN=1,同時選擇一個初始序號seq=x,x是任意正整數的值。此時TCP客戶端進程進入了一個SYN-SENT同步已發送的狀態。此時發送過去的數據包即報文段被稱為SYN報文段,它是不可以攜帶數據的。但是會消耗掉一個序號,這便是第一次握手了。
2)、當服務器接收到請求報文的時候,如果同意連接,會發送確認報文,確認報文中包含了TCP flags兩個標志位字段SYN=1,ACK=1,確認號是ack=x+1。由於客戶端發送SYN報文中的seq=x,服務器端為了回應客戶端,要回應和x相關的信息,但是客戶端發送SYN報文中的seq=x消耗了一個序號,因此服務器端發送的確認號便成了ack=x+1,同時為了自己的緩存初始化一個序列號即seq=y。此時服務器進入了SYN-RCVD狀態即同步已收到的狀態。該報文也是不可以攜帶數據的,並且同樣需要消耗一個序號,這便是第二次握手了。
3)、當TCP客戶進程收到確認報文之后,還要向服務器端給出一個確認,確認報文的ACK=1。ack=y+1,因為服務器發送的報文里面seq=y,而客戶端為了回應服務器端,要回應和y相關的信息,但是服務器端發送報文中的seq=y消耗了一個序號,因此客戶端發送的確認號便成了ack=y+1。seq=x+1,是因為第二次握手的時候,服務器端響應客戶端的時候以將ack=x+1即x序號加1,因此此時第三次握手的時候seq=x+1。此時客戶端和服務器端進入ESTAB-LISHED狀態即連接已建立。這便是第三次握手了。
4.2)、面試回答,握手是為了建立連接,TCP的三次握手流程大致如下所示:
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。切記,syn:同步序列編號(Synchronize Sequence Numbers)。
1)、第一次握手:建立連接時,客戶端發送SYN同步包(syn=x)到服務器,並進入SYN_SEND狀態即同步已發送,等待服務器確認。
2)、第二次握手:服務器收到SYN包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態即同步已收到(即server收到SYN同步包以后,同意建立連接,向client回復一個ACK。由於tcp是全雙工傳輸的,server端同時向client端發送一個同步請求SYN,申請server端向client端建立連接,此時服務器進入SYN_RECV狀態)。
3)、第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTAB LISHED狀態即連接已建立,完成三次握手(即client收到server的ack后,client端的連接狀態變成了ESTABLISHED,同時client端向server端發送ack響應,回復server端的syn請求,server端收到client端的ack響應以后,server端的連接狀態變成了ESTABLISHED。此時,建立連接完成,雙方隨時可以進行數據傳輸)。TCP的三次握手是為了建立雙向的連接。
5、為什么需要三次握手才能建立起連接呢?
答:為了初始化Sequence Number的初始化值。通信的雙方要互相通知對方自己的初始化的Sequence Number值。即seq=x和seq=y,seq值要作為以后的數據通信的序號,以保證應用層接收到的數據不會因為網絡上的傳輸問題而亂序,即Tcp會用這個序號進行拼接數據。因此在服務器回發它的Sequence Number即第二次握手之后還需要發送確認報文給服務器,告訴服務器客戶端已經收到你的初始化Sequence Number值。
6、首次握手的隱患SYN超時。問題起因分析。
答:Server服務器端收到Client客戶端發送的SYN,Server服務器端回復Client客戶端SYN-ACK的時候,如果此時Client客戶端掉線了,Server服務器端未收到Client客戶端的ACK確認。那么該連接就處於一個中間狀態,即未連接成功也未連接失敗狀態。此時Server服務器端不斷重試直至超時,Linux默認重試5次,重試間隔從1秒開始,每次翻倍,等待63秒鍾,tcp才會斷開連接。此時服務器可能遭受SYN Flood攻擊的風險。
針對SYN Flood攻擊風險的防護措施。比如惡意程序給服務器發送SYN報文,發送以后就進行了下線,然后服務器默認等待63秒才會斷開,攻擊者就會將服務器的SYN連接的隊列耗盡,讓正常的連接請求不能處理。Linux系統給出了一個方案,當SYN隊列滿后,通過tcp_syncookies參數回發SYN Cookie。TCP根據源地址端口,目標目的端口,時間戳生成一個特殊的Sequence Number即SYN Cookie回發給客戶端。如果是攻擊者是不會有響應的,若為正常連接則Client客戶端會回發服務器端SYN Cookie,直接建立連接。通過SYN Cookie創建的連接,即使現在SYN隊列滿后,本次連接請求不在隊列中,也可以創建連接。
如果建立連接后,Client客戶端出現故障怎么辦呢,其實TCP設置保活機制,在一段時間內,該時間被稱為保活時間keep alive time,在這段時間內,連接處於非活動狀態,開啟保活功能的一端將向對方發送保活探測報文。向對方發送保活探測報文,如果發送端未收到響應報文,如果在保活時間內即提前配置好的keep alive time則繼續發送。直到嘗試次數達到保活探測數仍未收到響應則中斷連接。對方直接將被確認為不可達,連接即被中斷。
7、TCP的四次揮手,揮手是為了終止連接,就是終止一個TCP連接的時候需要客戶端和服務器端總共發送4個包,以確認連接的斷開。客戶端或者服務器端任意一方觸發close斷開連接。TCP四次揮手的流程圖如下所示:
7.1)、四次揮手詳細介紹如下所示:
1)、數據傳輸完畢以后呢,客戶端和服務器端都可以釋放連接,最開始的時候,客戶端和服務器端都處於ESTAB-LISHED狀態即連接已建立。當客戶端主動關閉,服務器端被動關閉。首先客戶端進程發送連接釋放報文,並且停止發送數據,在該數據的報頭中tcp flags中的FIN=1,假設客戶端定義的序列號seq=u,該值等於前面ESTAB-LISHED狀態下數據最后一次發送已經傳送過來的數據最后一個字節的序號加一。此時客戶端進入FIN-WAIT-1的狀態即中止等待1的狀態(FIN-WAIT-1是finish-wait-1的縮寫)。TCP規定,即使FIN報文段不攜帶任何數據,也要消耗一個序列號。即服務器端回值的時候ack=u+1。這就是第一次揮手。
2)、當服務器端收到連接釋放報文的時候,也要發出確認報文即ACK=1,作為回應ack=u+1,Sequence Number序列號等於u+1。並且攜帶了自己的序列號seq=v。此時服務器端進入了CLOSE-WAIT狀態即關閉等待。這就是第二次揮手。
3)、TCP服務器通知高層的應用進程,客戶端要釋放和服務器通信的連接了,此時會處於半關閉的狀態,即客戶端無數據要發送了,但是服務器端若要給客戶端發送數據,客戶端還是可以接收的,此半關閉狀態持續的時間就是等於CLOSE-WAIT狀態持續的時間。客戶端收到服務器端的確認請求后,也就是第二次揮手的時候,此時客戶端進入了FIN-WAIT-2狀態即中止等待2狀態。等待服務器發送釋放連接報文,等待服務器端發送第三次揮手的請求。因此這段時間內,還有可能需要接收服務器端發送的數據請求,當服務器將最后的數據發送完畢以后,就會向客戶端發送連接釋放報文,即FIN=1,ack還是等於u=1即ack=u+1,由於在半關閉的狀態,服務器很可能發送了一些數據,假定此時的序號seq=w,此時服務器進入了LAST-ACK狀態即最后確認的狀態。等待客戶端的最終確認,這就是第三次揮手。
4)、當客戶端收到服務器端釋放連接報文的時候,必須發出確認,即ACK=1,將服務器發送的w加1,即ack=w+1,由客戶端回發給服務器端。此時客戶端的需要假定現在是seq=u+1。此時客戶端進入了TIME-WAIT狀態即時間等待的狀態,此時tcp連接還未釋放,必須等待時間是2MSL(2乘以MSL時間,MSL是最長報文段壽命)。此時連接才真正釋放,才進入到了CLOSE狀態。當服務器端接收到客戶端的確認請求以后立即進入了CLOSE狀態即關閉狀態。說明了服務器端結束TCP連接時間比客戶端結束TCP連接的時間稍早一些。這就是第四次揮手。
7.2)、面試回答,揮手是為了斷開連接,TCP采用四次揮手來釋放連接。TCP的四次揮手流程大致如下所示:
1)、第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態即中止等待1的狀態(即tcp的四次揮手是為了斷開連接,通信雙方都可以先發起斷開連接請求。這里以client作為先發起斷開連接的一端,通信中的client、server都是ESTABLISHED的狀態,client先發起來了關閉連接的請求,client端向server端發送了FIN包,表示client端沒有數據要發送了,client端進入了FIN_WAIT_1狀態了。)。
2)、第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態即關閉等待狀態(即server端收到FIN包以后,向client發送ACK確認,然后server端進入了CLOSE_WAIT狀態,此時server屬於半關閉狀態,因為此時client不會再向server端發送數據了,server端向client端可能還要發送數據的,當server端數據發送完畢以后)。
3)、第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態即最后確認狀態(即當server端數據發送完畢以后,server端向client端發送FIN包,表示server端也沒有數據要發送了,此時server進入了LAST_ACK狀態,等待client端的應答就可以關閉連接了。)。
4)、第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態即時間等待狀態,接着發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態即關閉狀態,完成四次揮手(即client端收到server端的FIN后,回復ACK,進入TIME_WAIT狀態,切記TIME_WAIT狀態下,需要等待2倍的MSL最大報文段生存時間,來保證連接的可靠關閉,之后client進入CLOSE關閉狀態,server收到client的ack以后,直接進入close狀態。)。
8、為什么會有TIME_WAIT狀態呢。
答:TIME-WAIT時間等待狀態到CLOSE關閉狀態,有一個超時設置,這個超時設置是2乘以MSL。為什么要等待這一段時間呢,TIME-WAIT狀態主要是要確保有足夠的時間讓對方收到ACK包,如果被動關閉的哪一方沒有收到ACK確認,就會觸發被動端重發FIN包(FINISH包)一來一去正好是2乘以MSL。也避免了新舊連接混淆,不讓這個連接和后面的連接混到一起。
9、為什么需要四次揮手才能斷開連接呢?
答:全雙工的意思是允許數據在兩個方向上同時傳輸,即在同一時間服務器可以發送給客戶端,客戶端也可以發送數據給服務器。因為TCP是全雙工,發送方和接收方都需要FIN報文和ACK報文,也就是說發送方和接收方各自需要兩次揮手即可,只不過有一方是被動的,所以,看上去就變成了四次揮手。
10、服務器頻繁出現大量CLOSE_WAIT狀態的原因?
答:問題的其中一個表現是客戶端一直在請求,但是返回給客戶端的信息是異常的,即客戶端沒有收到過請求。服務器保存了大量的CLOSE_WAIT狀態,只有一種情況,那就是在客戶端發送一個FIN報文的時候,服務器這邊沒有進一步發送ACK確認或者FIN報文已確認。換句話說就是對方關閉socket連接,程序沒有檢測到或者程序本身忘記需要關閉連接,該資源一直被程序占用着(我方忙於讀或者寫),沒有及時關閉連接。遇到這種情況(可能是程序中有Bug哦),要及時檢查代碼,特別是釋放資源的代碼。或者是配置出現了問題,要檢查配置,特別是處理請求的線程配置。
為什么要等待2倍的MSL時間才可以進入關閉鏈接。原因有二,第一個是保證tcp協議的全雙工鏈接能夠可靠關閉,第二個是要保證這次鏈接中重復的數據段能夠從網絡中消失,防止端口被重用的時候可能會產生數據混淆。無論是建鏈還是斷鏈,都是從兩個方向上進行,只不過建鏈的時候,server端的SYN和ACK包是合並為一次發送。而短鏈的時候,兩個方向的數據發送的停止時間可能是不同的,所以無法合並FIN和ACK包,FIN和ACK是分開發送的。這就是建鏈的時候必須要三次握手,斷鏈的時候要四次握手的原因。
11、TCP與UDP的區別。TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)協議屬於傳輸層協議。
UDP的特點,如下所示:
a)、UDP的特點是面向非連接的協議,傳輸數據之前,源端和目標端沒有創建連接。當想要傳輸的時候,就抓取來自應用程序的數據,並盡可能快的將它傳輸到網絡上,在發送端,UDP傳輸數據的速度僅僅是受應用程序生成數據的速度、計算機的能力、傳輸帶寬的限制影響,在接收端,UDP把每個消息段放到隊列中,應用程序每次從隊列中讀取消息段。
b)、UDP傳輸數據的時候不建立連接,所以不維護連接狀態,支持同時向多個客戶端傳輸相同的消息。
c)、UDP數據包報頭只有8個字節,額外開銷較小。TCP包報頭需要22個字節。
d)、UDP吞吐量只受限於數據生成速率、傳輸速率以及機器性能(源端和終端機器的性能)。
e)、UDP盡最大努力交付,不保證可靠交付,不需要維護復雜的鏈接狀態表。
f)、UDP面向報文,不對應用程序提交的報文信息進行拆分和合並。
12、TCP的滑動窗口簡述。
1)、RTT是發送一個數據包到收到對應的ACK,所花費的時間。即源端發送一個數據包,到目標端回應一個ACK所花費的時間。
2)、RTO是重傳時間間隔。RTO是本次發送當前數據包預留的超時時間,RTO是根據RTT計算出來的。TCP在發送一個數據包的時候,會啟動一個重傳定時器,RTO就是這個重傳定時器重傳時間。通俗的講,預先計算一個定時器重傳時間,如果回復了ACK,該重傳定時時間失效,即不用重傳了。如果沒有回復ACK,定時器的時間又到了,就開始重傳。TCP會將數據拆分成段進行發送,出於效率和傳輸速度的考慮,不能一段一段將數據進行傳送,因為此傳輸效率十分低下,所以要實現對數據的批量發送。
3)、Tcp必須要解決可靠傳輸以及包亂序的問題,所以TCP需要知道網絡實際處理數據的帶寬,數據處理速度,這樣才不會引起網絡擁塞,導致丟包情況發生。
4)、TCP使用滑動窗口做流量控制與亂序重排。TCP的滑動窗口主要有兩個作用,保證TCP的可靠性,保證TCP的流控特性。
13、HTTP超文本傳輸協議(基於請求與響應模式的無狀態的應用層協議,常基於TCP的連接方式),HTTP1.1版本中給出一種持續連接的機制keep-alive,絕大多數web開發都是構建在http上面的web應用。注意,TCP是傳輸層協議,HTTP是應用層協議,HTTP是基於TCP協議的一種連接方式。主要特點,如下所示:
1)、特點一、支持客戶端和服務器端模式。HTTP協議工作於客戶端和服務器端架構之上的,瀏覽器作為HTTP客戶端通過URL向HTTP服務器端即web服務器發送所有請求。WEB服務器根據接收到的請求向客戶端發送響應信息。
2)、特點二、簡單快速。客戶端向服務器端請求服務的時候,只需要傳送請求方法和請求路徑,請求方法常用的有GET、POST、PUT、DELETE等等,每種方法規定了客戶端與服務器連接的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3)、特點三、靈活。HTTP允許傳輸任意類型的數據對象。正在傳輸的對象由context type加以標記。
4)、特點四、無連接。無連接的含義是限制每次連接只處理一個請求,服務器處理完客戶的請求,並收到客戶的應答以后即斷開連接。采用該方式節省傳輸時間。從HTTP1.1起,默認使用了長連接,即服務器需要等待一定時間后才斷開連接,以保證連接特性。雖然目前的技術,如keep alive使用了長連接優化效率,但是這些都是屬於HTTP請求之外的,也即在每個獨立的http請求中,你是無法知道當前的http是否處於長連接的狀態,你始終會認為http請求在處理結束以后連接就會關閉,這是http的特性。長連接可以認為是下層實現對上層透明。
5)、特點五、無狀態。http協議是無狀態協議,無狀態是指協議對事物處理沒有記憶能力,缺少狀態意味着如果后續處理需要前段信息則必須被重新傳輸,這樣可能會導致每次連接傳送的數據量增大。另一方面在服務器不需要先前信息的時候,它的應答就較快。HTTP協議目前處於多個版本共存的情況(HTTP1.0版本,HTTP1.1版本,HTTP2.0版本)。HTTP1.1版本相對於HTTP1.0版本引入了keep alive長連接技術。
14、HTTP的請求結構(HTTP請求報文),主要包含請求行、請求頭部、空行、請求正文四部分組成。
1)、請求行包含三個部分(請求方法、URL路徑、協議版本),請求方法、空格、URL路徑、空格、協議版本、回車符、換行符。
2)、請求頭部有若干個報頭組成,每個報頭包含,頭部字段名、分號、值、回車符、換行符。即使請求正文沒有內容,也會空一行出來的。
15、HTTP的響應結構(HTTP響應報文),發送請求報文以后,正常情況下會收到響應報文。主要包含狀態行、響應頭部、空行、響應正文四部分組成。
16、HTTP的簡介以及請求響應的步驟,如下所示:
1)、Http簡介,http協議定義了web客戶端如何從web服務器請求web頁面,以及服務器如何把web頁面傳送給客戶端,http協議采用了請求響應模型,客戶端向服務器發送請求報文,請求報文包含了請求方法、URL、協議版本、請求頭部、請求數據。服務器以一個狀態行作為響應,響應的內容包含了協議的版本,成功或者失敗的狀態碼,服務器信息,響應頭部和響應數據。
2)、請求響應的步驟。
a)、客戶端連接到web服務器,一個http客戶端通常是瀏覽器與web服務器的http端口,默認端口號是80,建立一個tcp套接字連接。
b)、然后發送http請求,即通過tcp套接字,客戶端向web服務器發送一個文本的請求報文。
c)、然后服務器接受到客戶端的請求並返回HTTP響應。web服務器解析該請求定位請求資源,服務器將資源副本寫到tcp套接字由客戶端讀取。
d)、然后釋放TCP連接。若連接模式是CLOSE,則服務器主動關閉tcp連接,客戶端被動關閉tcp連接,釋放tcp連接。若連接模式是keep alive,咋該連接會保持一段時間,在該時間內可以繼續接受請求。
e)、然后客戶端瀏覽器解析HTML內容。並進行解析,客戶端瀏覽器首先解析狀態行,查看表名請求是否成功的狀態代碼,然后解析每一個響應頭,響應頭告知以下若干字節的HTML文檔和文檔的字符集,客戶端瀏覽器讀取響應數據HTML,根據html語法對其進行格式化,並在瀏覽器窗口中進行解釋。
17、在瀏覽器地址欄鍵入URL,按下回車以后經歷的流程,如下所示:
a)、DNS解析,瀏覽器會根據URL逐層查詢DNS服務器緩存,解析URL中的域名所對應的IP地址。DNS緩存從近到遠依次是瀏覽器緩存、系統緩存、路由器緩存、ips服務器緩存、根域名服務器緩存、頂級域名服務器緩存。從那個緩存找到對應的ip以后直接返回,不再查詢后面的緩存。
b)、TCP連接。找到ip地址以后會根據ip地址和默認端口80,和服務器建立tcp連接。該步驟即是三次握手了。
c)、發送HTTP請求。此時瀏覽器會發送讀取文件的http請求,該請求將發送給服務器。
d)、服務器處理請求並返回HTTP報文。服務器對瀏覽器請求做出響應並把對應的帶有html文本的http響應報文發送給瀏覽器。
e)、瀏覽器解析渲染頁面。然后瀏覽器收到html並在顯示窗口內進行渲染。
f)、連接結束。最后瀏覽器是否了TCP連接。該步驟即是四次揮手。
18、HTTP狀態碼,五種可能的取值。
a)、1xx,指示信息,表示請求已接收,繼續處理。
b)、2xx,成功,表示請求已被成功接收、理解、接受。
c)、3xx,重定向,要完成請求必須進行更進一步的操作。
d)、4xx,客戶端錯誤,請求有語法錯誤或者請求無法實現。
e)、5xx,服務器端錯誤,服務器未能實現合法的請求。
19、常見HTTP狀態碼。如下所示:
20、GET請求和POST請求的區別,從三個層面來進行解答。如下所示:
1)、第一點區別:Http報文層面,GET將請求信息放到URL,請求信息與URL之間使用問號隔開,請求信息格式是鍵值對的形式,POST將請求信息放在報文體中,獲取請求信息必須解析報文。GET請求是放在URL中的,URL本身是沒有長度限制的,但是瀏覽器是有長度限制的,會對URL進行長度限制。POST是將請求信息放到報文體中的,所以對URL是沒有長度限制的。
2)、第二點區別:數據庫層面,GET符合冪等性(對數據庫的一次操作或者多次操作的結果是一致的,則認為符合冪等性)和安全性(對數據庫的操作沒有改變數據庫的數據,則認為符合安全性的,GET操作是做查詢操作的,因此不會改變數據庫里面的數據),POST不符合(POST請求既不冪等也不安全,POST會向數據庫中提交數據,所以會改變數據庫里面的數據,POST每次獲取到的結果都有可能不一樣的,因為POST請求是作用在上一級的URL上面的,每一次請求都會添加新資源)。
3)、第三點區別:GET請求可以被緩存(可以保存到瀏覽器的瀏覽記錄中),被存儲(GET請求URL可以被保存為瀏覽器書簽),但是POST不行。
21、Cookie和Session的區別,如下所示:
1)、因為HTTP是無狀態的,意味着每次訪問有登錄頁面的需求的時候,都要輸入賬號和密碼。Cookie技術是客戶端的解決方案,是由服務器發送給客戶端的特殊信息,以文本的形式存放在客戶端。客戶端每次向服務器發送請求的時候都會帶上這些特殊信息,比如當客戶使用瀏覽器訪問支持Cookie的網站的時候,需要輸入賬號和密碼提到到服務器,服務器向客戶端回應超文本的同時將個人信息返回,個人信息不是存放在響應體http body中,而是保存到HTTP響應頭http header中的,當客戶端接收服務器的響應以后,瀏覽器將這些信息存放到統一位置。客戶端再次請求的時候,會把Cookie發送到服務器中,Cookie信息存放到http響應頭中。服務器接收到客戶端瀏覽器的請求以后,會分析存放在請求頭中的Cookie信息,得到客戶端特有的信息,從而動態生成與該客戶端相對應的內容。會解析Cookie生成與客戶端相對應的內容。
2)、Cookie的設置以及發送過程,第一步,客戶端發送Http Requert請求到服務器。第二步,服務器端發送Http Response和設置Cookie頭部到客戶端。第三步,客戶端Http Request和Cookie頭部請求到服務器端。第四步,服務器端發送一個Http Response請求到客戶端。
3)、Session機制是一種服務器端的機制,在服務器上保存的信息。當程序需要為某個客戶端的請求創建一個Session的時候,服務器首先檢查這個請求里面是否已經包含session標識session id,如果包含了session id,說明之前為此客戶端創建該Session,服務器根據Session id把這個session檢索出來使用,如果檢索不到,可能會新建一個Session,如果客戶端請求不包含Session id,則為此客戶端創建一個Session並生成一個與此Session相關的Session id(此Session id是不會重復且無規律的字符串)。
4)、Session的實現方式,主要有兩種。第一種是使用Cookie進行實現。客戶端發送請求,服務器給每個Session分配一個唯一的jsession id,並通過Cookie發送給客戶端,當客戶端發起新的請求的時候,將在Cookie頭中攜帶這個jsession id,服務器可以查到對應的Session。第二種方式是使用URL回寫來實現。服務器在發送給瀏覽器頁面的所有鏈接中都攜帶jsession id參數,這樣客戶端點擊任何一個鏈接,都會將jsession id帶回服務器。如果直接在瀏覽器輸入服務端資源的URL來請求該資源,session是匹配不到的,tomcat對session的實現是一開始同時是使用cookie和url回寫機制,如果發現客戶端支持cookie,就繼續使用cookie,停止使用url回寫機制,如果發現cookie被禁用,就一直使用url會寫機制。
22、HTTP與HTTPS的區別。
1)、HTTP(Hyper Text Transfer Protocol)是超文本傳輸協議,HTTPS(Hyper Text Transfer Protocol Secure)是超文本傳輸安全協議。HTTPS是一種以計算機網絡安全通信為目的的傳輸協議。HTTP是包含了ip、tcp、http,而HTTPS比HTTP新增了SSL或者TLS(具有保護交換數據隱私,以及完整性,提供對網上服務器身份認證的功能,是安全版的http)。
2)、SSL(Securiy Sockets Layer,安全套接層),為網絡通信提供安全以及數據完整性的一種安全協議,SSL位於TCP與各應用層之間,是操作系統對外的API,SSL3.0以后更名為TLS。采用身份驗證和數據加密保證網絡通信的安全和數據的完整性。
3)、Https采用了證書和加密手段的方式保證數據的安全性。Https數據傳輸流程,Https在數據傳輸之前,會與網站服務器和web瀏覽器進行一次握手,在握手的時候確認雙方的加密密碼信息。具體流程如下所示。
a、web瀏覽器將支持的加密算法信息發送給網站服務器。
b、服務器選擇一套瀏覽器支持的加密算法,將驗證身份的信息以證書的形式回發瀏覽器。
c、瀏覽器收到證書以后驗證證書的合法性,如果證書受到瀏覽器信任,在瀏覽器地址欄有標志顯示,否則顯示不受信的標識。當證書受信以后,web瀏覽器隨機生成一串密碼,並使用證書中的公鑰加密,之后使用約定好的hash算法握手消息b並生成隨機數對消息進行加密,並將之前生成的信息回發給服務器。
d、服務器接收到web瀏覽器發送的消息以后,服務器使用私鑰解密信息確認密碼,然后通過密碼解密web瀏覽器發送過來的握手信息,並驗證哈希是否和web瀏覽器一致,加密新的握手響應消息回發瀏覽器。
e、web瀏覽器解密服務器經過哈希算法加密的握手響應消息,並對消息進行驗真,如果和服務器發送過來的消息一致,則此握手過程結束以后,服務器和瀏覽器會使用之前瀏覽器生成的隨機密碼和對稱密碼進行加密,然后交換數據。
4)、HTTP與HTTPS的區別面試回答點。
區別一、HTTPS需要到CA申請證書,HTTP不需要。
區別二、HTTPS(Hyper Text Transfer Protocol Secure)是超文本加密傳輸協議,具有安全性的SSL加密傳輸協議,是密文傳輸,HTTP(Hyper Text Transfer Protocol)是超文本傳輸協議,是明文傳輸。
區別三、連接方式的不同,端口的不同,HTTPS默認使用的端口是443端口,HTTP默認使用的端口是80端口。
區別四、HTTPS=HTTP+加密+認證+完整性保護,SSL是有狀態的,而HTTP連接是無狀態的。
23、什么是Scoket呢?
Socket是對TCP/IP協議的抽象,是操作系統對外開發的接口。Socket是基於從打開,到讀或者寫,再到關閉的模式。
兩個進程之間如果需要通信,最基本的一個前提是能夠唯一的標識一個進程,在本地進程通信中我們可以使用pid來唯一標識一個進程,但是pid只是在本地唯一,網絡中兩個進程pid沖突的可能性還是存在的,這個時候需要再想它法。ip層的ip地址可以唯一標識一台主機,而tcp協議和端口號可以唯一標識主機的一個進程,這樣我們可以利用ip地址加協議加端口號來唯一標識網絡中的一個進程。當可以唯一標識網絡中一個進程以后,我們就可以利用socket進行通信了。
24、Socket通信流程。
作者:別先生
博客園:https://www.cnblogs.com/biehongli/
如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。