TCP與UDP區別
1. TCP面向連接,UDP無連接,所以UDP數據傳輸效率更高
2.UDP可以支持一對一、一對多、多對一、多對多通信,TCP只能一對一
3. TCP需要在端系統維護連接狀態,包括緩存,序號,確認號,擁塞控制參數等,UDP不維護
4.TCP首部20字節,UDP首部8字節
5.UDP沒有擁塞控制,應用層對于數據發送的控制更靈活,某些應用需要穩定速率發送,允許少量丟失,UDP可以穩定發送不受網絡擁塞程度影響
6. TCP是可靠交付,UDP不保證可靠傳輸,但可以在應用層做出自己的可靠性機制
7.TCP傳輸的是報文段,應用層數據視為字節流,傳輸時可能分片也可能多報文合并傳輸,UDP傳的是用戶數據報,由應用層決定多長,不合不拆
TCP連接建立
服務器進入LISTEN(監聽)狀態后,客戶端可以發送連接請求。這個連接請求報文段SYN同步位設置1,初始序號seq=x,不攜帶數據但消耗一個序號。 發送后客戶端進入SYN-SENT(同步已發送)
服務器如果同意連接,發回確認報文段并分配資源。 確認報文段SYN=1,ACK=1,確認號ack=x+1,同時也選擇自己的初始序號seq=y。確認報文也不攜帶數據,消耗一個序號。 發送確認后服務器進入SYN-RCVD(同步確認)
客戶端收到確認后向服務器發出確認,并為連接分配資源。確認報文段ACK=1,seq=x+1,ack=y+1該報文可以攜帶數據,如果攜帶數據消耗一個序號,不攜帶數據不消耗序號。發送確認后客戶端進入ESTABLISHED(連接建立)
服務器收到客戶端確認后進入ESTABLISHED(連接建立)
(由于服務器接收到連接請求,如果同意就分配資源,那么多個客戶機只發連接請求,但不回應服務器確認報文,就會導致服務器資源消耗盡,稱為SYN洪泛攻擊)
TCP連接釋放
客戶端發送連接釋放報文段,然后停止發送數據。報文段FIN設置為1,序號seq=u,(u是客戶端發送最后一個數據字節的序號+1),FIN可攜帶數據,無論有沒有攜帶都消耗一個序號。發送完報文段后客戶端進入FIN-WAIT-1(終止等待1)
服務器發出確認報文段,ACK=1,確認號ack=u+1,序號seq=v,(v是此tcp連接的服務器發送的最后一個數據字節的序號+1)。服務器發送確認后進入CLOSE-WAIT(關閉等待),這個狀態下還會繼續向客戶端發送未完成的數據
客戶端接收到服務器的確認報文后,進入FIN-WAIT-2(終止等待2),直到服務器發完想發的數據
如果服務器發送完想發的數據或者根本沒有數據要發,就發出連接釋放報文段。報文段FIN=1,ACK=1,ack=u+1,seq=w (seq=w是因為服務器發送了未完成的數據)。發送連接釋放報文段后服務器進入LAST-ACK(最后確認)
客戶機收到連接釋放報文段,向服務器發出確認。確認報文段ACK=1,seq=u+1,ack=w+1。發送確認后,進入TIME-WAIT(定時等待) ,開始計時,如果經過2個最長報文段壽命(2MSL),都沒有接收到服務器重傳的連接釋放報文段,客戶機就可以安心進入CLOSED(連接關閉)
服務器接收到客戶機連接釋放的確認報文后進入CLOSED,如果一直沒接到連接釋放的確認報文,就重發連接釋放報文段。
套接字通信(socket)
一般網絡通信有兩種方式,應用層給傳輸層TCP傳報文段或者給UDP傳用戶數據報。為了方便使用傳輸層的兩個協議才產生socket通信。套接字其實就是系統提供的網絡編程接口,使得我們不用考慮建立連接的細節就能使用網絡通信。兩個進程通信,各使用一個套接字,套接字含IP地址,端口,通信協議,還可以支持加密,方便我們使用網絡。socket套接字支持使用TCP和UDP,還可以不用這兩種協議,而是自己控制傳輸方法。通過套接字可以創建TCP或者UDP連接。
winsock建立連接的主要實現步驟?
??? 服務器端:socket()建立套接字,綁定(bind)端口并監聽(listen)連接,用accept()等待客戶端連接, accept()發現有客戶端連接,建立一個新的套接字接收。該新產生的套接字使用send()和recv()寫讀數據,直至數據交換完畢,closesocket()關閉套接字。
??? 客戶端:socket()建立套接字,連接(connect)服務器,連接上后使用send()和recv(),在套接字上寫讀數據,直至數據交換完畢,closesocket()關閉套接字。
??? 套接字關閉時有兩個函數,close和shutdown,close使引用計數減1,計數為0釋放套接字,未發送的數據仍會繼續發;shutdown切斷連接,但沒有釋放socket
套接字三種類型
流式socket(tcp傳輸),數據報式(udp傳輸),原始socket(可以讀寫內核沒有處理的IP數據包)
TCP為什么不是兩次連接?而是三次握手?
如果A與B兩個進程通信,如果僅是兩次連接。可能出現的一種情況就是:A發送完請報文以后,由于網絡情況不好,出現了網絡擁塞,即B延時很長時間后收到報文,即此時A將此報文認定為失效的報文。B收到報文后,會向A發起連接。此時兩次握手完畢,B會認為已經建立了連接可以通信,B會一直等到A發送的連接請求,而A對失效的報文回復自然不會處理。依次會陷入B忙等的僵局,造成資源的浪費。
FTP的連接模式
FTP是應用層協議,傳輸層使用TCP。工作時使用兩個并行TCP連接,控制連接端口號21,數據練級端口號20.
服務器監聽21號端口,等待連接。控制連接用來傳控制信息,如連接請求,傳送請求等,以7位ASCII碼格式傳送。
建立控制連接后,如果服務器控制進程接收到客戶端文件傳送請求,就建立數據傳送進程和數據連接,由兩個數據傳送進程進行數據通信。
建立的數據連接有主動模式和被動模式。主動模式是客戶端開放一個端口,發送控制信息給服務器,由服務器20號端口連接客戶端開放的端口。被動模式是客戶端發控制命令告訴服務器使用被動模式,服務器開放一個隨機端口并高斯客戶端,客戶端再連接到此端口。
(使用被動模式一般是因為客戶端防火墻對于開放端口有影響)
HTTP過程
http是應用層協議,本身無連接,在傳輸層使用tcp連接。
訪問www服務器時,首先是DNS域名解析,獲取ip地址后瀏覽器向服務器發tcp連接請求,建立tcp連接后,瀏覽器向服務器發http請求,服務器返回http響應,瀏覽器對信息進行解釋,顯示web頁面,最后釋放tcp連接。
http可以使用持久連接和非持久連接,持久連接就是在獲取服務器響應后不釋放tcp連接,可以繼續使用此連接向服務器請求數據。
對于持久連接可以分流水線方式請求和非流水線方式請求。流水線方式是沒收到響應前可以繼續發請求,非流水線方式要求接收到響應才能繼續發下一個請求。
Cookie原理
用戶瀏覽某個網站,服務器為用戶產生Cookie,包含一些信息,如用戶的標識符、會話ID、用戶偏好等,通常以“名/值”對(name-value pairs)的形式存儲。接著返回的響應報文添加一個Set-cookie字段將cookie一起返回。
用戶接收到響應,Cookie文件保存在本地
下次訪問時,將之前存儲的Cookie發送回服務器。這通常通過HTTP請求頭中的Cookie
字段完成。
GET和POST
GET方法用于從Web服務器請求數據。在使用GET方法時,瀏覽器向Web服務器發送一個請求,Web服務器將響應數據發送回瀏覽器。GET方法是無狀態的,也就是說每個請求都是獨立的,沒有前后關系。GET方法通常用于請求靜態數據,如HTML頁面、圖片和CSS文件等。 POST方法用于向Web服務器提交數據。在使用POST方法時,瀏覽器將數據打包并發送到Web服務器。Web服務器收到數據后,可以根據數據執行相應的操作,并向瀏覽器發送響應。POST方法是有狀態的,也就是說請求和響應之間存在關系,請求和響應之間的數據可以互相傳遞。POST方法通常用于向Web服務器提交表單數據和上傳文件等操作。 |
在使用GET方法時,瀏覽器將請求的參數附加到URL的末尾,以“?”號開始,并用“&”符號將多個參數連接在一起。 在使用POST方法時,瀏覽器將要請求的數據打包并放置在HTTP請求體中。請求頭中會包含請求體的大小等信息。 |
GET方法將數據附加到URL中,因此數據大小有限制。在URL中,只能傳遞ASCII字符,并且URL的長度有限制。 POST方法將數據放在HTTP請求體中,因此數據大小不受限制。但是,Web服務器和Web應用程序可能會對POST請求的大小進行限制。 |
GET方法的參數是通過URL傳遞的,因此可以很容易地在瀏覽器地址欄中看到。 POST方法將數據放在HTTP請求體中,因此相對于GET方法更加安全。但是請求體可能被捕獲。 |
GET方法具有緩存機制。如果瀏覽器請求的資源已經在本地緩存中存在,瀏覽器將使用緩存而不是向服務器發送請求。這可以提高Web應用程序的性能。 POST方法沒有緩存機制。每次使用POST方法發送請求時,瀏覽器都會向Web服務器發送請求,Web服務器也會重新處理請求。因此,POST方法的性能相對于GET方法較低。 |
常見的 HTTP 狀態碼有哪些
1xx??????? 信息,服務器收到請求,需要請求者繼續執行操作
2xx??????? 成功,操作被成功接收并處理
3xx??????? 重定向,需要進一步的操作以完成請求
4xx??????? 客戶端錯誤,請求包含語法錯誤或無法完成請求
5xx??????? 服務器錯誤,服務器在處理請求的過程中發生了錯誤
HTTPS 和 HTTP 的區別
? ? ?HTTPS 相較 HTTP 不是一種新協議,只是在 HTTP 通信接口部分使用了 SSL和TLS協議來實現。使得?HTTP 先與 SSL 通信,再由 SSL 和 TCP 通信,而不是 HTTP 直接與 TCP 通信。
??? 1.SSL安全協議
??? HTTP 信息是明?傳輸,存在安全?險的問題。
??? HTTPS 在TCP 和 HTTP ?絡層之間加?了 SSL/TLS 安全協議,使得報?能夠加密傳輸。
??? 2.建立連接
??? HTTP 連接建?相對簡單, TCP 三次握?之后便可進? HTTP 的報?傳輸。
??? HTTPS 在 TCP 三次握?之后,還需進? SSL/TLS 的握?過程,才可進?加密報?傳輸。
??? 3.端口號
??? HTTP 的端?號是 80。
??? HTTPS 的端?號是 443。
??? 4.CA證書
??? HTTPS 協議需要向 CA(證書權威。機構)申請數字證書來保證服務器的身份是可信的。
https的請求過程?
??? 用戶在瀏覽器里輸入一個https網址,然后連接到server的443端口。
??? 服務器將自己的數字證書(含有公鑰)發送給客戶端。
??? 客戶端收到服務器端的數字證書之后,會對其進行檢查,如果不通過,則彈出警告框。如果證書沒問題,則生成一個密鑰(對稱加密),用證書的公鑰對它加密。
??? 客戶端會發起HTTPS中的第二個HTTP請求,將加密之后的客戶端密鑰發送給服務器。
??? 服務器接收到客戶端發來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后得到客戶端密鑰,然后用客戶端密鑰對返回數據進行對稱加密,這樣數據就變成了密文。
??? 服務器將加密后的密文返回給客戶端。
??? 客戶端收到服務器發返回的密文,用自己的密鑰(客戶端密鑰)對其進行對稱解密,得到服務器返回的數據。
對稱加密和非對稱加密的區別
??? 對稱加密算法:加密和解密使用相同密鑰的加密算法。常見的對稱加密算法有AES、3DES、DES、RC5、RC6等。
??? 非對稱加密算法:非對稱加密算法需要兩個密鑰(公開密鑰和私有密鑰)。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有對應的私鑰才能解密。主要的非對稱加密算法有:RSA、Elgamal、DSA、D-H、ECC。