1.TCP/IP四層模型
# 1.網絡接口層(物理層,數據鏈路層) # 2.網絡層 # 3.傳輸層 # 4.應用層(會話層,表示層,應用層)
2.TCP與UDP區別
# TCP:面向連接,可靠的,速度慢,效率低 # UDP:無連接,不可靠,速度快,效率低
3.TCP/UDP應用
# TCP
對通信質量有要求的,例如HTTP,HTTPS協議 # UDP
不需要一對一溝通,建立連接的,可以做到一對多,如廣播,直播
需要處理速度快的,能容忍丟包的
4.三次握手四次揮手
# 三次握手
# 1.客戶端發送一個帶SYN標志的TCP報文到服務器端,並進入SYN_SEND狀態,等待服務端確認 # 2.服務端收到客戶端的報文並返回一個同時帶ACK標志和SYN報紙的報文,進入SYN_RECV狀態。表示確認剛才客戶端的報文,同時詢問客戶端是否准備好通訊 # 3.客戶端再次回應服務端一個ACK報文,雙方進入ESTABILISHED狀態
# 四次揮手 # 1.TCP客戶端發送一個FIN,用來關閉客戶端到服務端的數據傳送 # 2.服務端收到這個FIN,它發揮一個ACK,確認序號為收到的序號加一 # 3.服務端關閉客戶端的連接,發送一個FIN給客戶端 # 4.客戶端發回ACK報文確認,並將確認序號設置為收到序號加一
5.為什么連接的時候是三次握手,關閉的時候是四次揮手?
# 因為服務端收到客戶端的SYN連接請求報文后,可以把ACK和SYN(ACK起應答作用,SYN起同步作用)放在一個報文里發送。但關閉連接時,當收到對方的FIN報文時,它僅僅表示對方沒有數據發送給你了,但為你所有的數據都全部發送給對方了,所以你未必會馬上關閉SOCKET,也就是說你可能還需要發送一下數據給對方之后,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以這里的ACK和FIN多數情況下都是分開發送的。
6.為什么不能TIME_WAIT狀態還需要等待2MSL后才能返回到CLOSED狀態?
# 雖然4個報文都發送完畢,按理可以直接進入CLOSED狀態。但是,假設網絡是不可靠的,最后一個ACK可能會丟失,所以TIME_WAIT狀態就是用來重發丟失的ACK。此時處於LAST_ACK的SOCKET會因超時未收到ACK,而重發FIN報文,直接接收到ACK才結束TCP連接。 # 等待2MSL:2MSL是一個發送和一個回復所需的最大時間,Client進入TIME_WAIT狀態會設置一個計時器,等待2MSL,如果直到2MSL,Client沒有再收到FIN,那么Client推斷ACK已被成功接收,關閉連接。
7.為什么不能用兩次握手?
# 客戶端和服務端通信,假定客戶端給服務端發送一個連接請求,服務端收到后返回ack應答,按照兩次握手,服務端認為連接已經成功建立,並開始發送數據.假設網絡是不可靠的,客戶端沒有收到服務端的ack應答,客戶端認為還未建立連接,將忽略服務端發來的所有數據,只等待服務端的ack應答,造成死鎖
8.如果已經建立了連接,但是客戶端發生故障?
# TCP設有一個保活計時器,如果一端長時間未收到任何數據,則會每隔一段時間發送探測報文,若一連發送10個報文仍沒反應,則認為對方發生故障,關閉連接
9.為什么說TCP是可靠的?
# 首先TCP是面向連接的,客戶端發送一段數據都需要服務端確認 # 1.序列號 TCP在傳輸過程中,對每一個字節都進行了編號,確保數據按序到達 # 2.超時重傳 當客戶端給服務端發送數據,由於網絡等原因,數據包沒有到達服務端,或者服務端的響應數據包沒有在超時重傳時間內到達客戶端,會重新發送數據 # 3.流量控制 TCP窗口會指明雙方能夠發送和接收的最大數據量 # 4.擁塞控制 慢啟動 擁塞避免 擁塞解決 快速恢復