網路的核心是分開的終端的應用程式之間通過資訊的交流來完成功能。圍繞著這些資訊,如何使得這些資訊能夠準確地傳遞到某個終端的應用程式中,並且使得該應用程式能夠準確讀出這些資訊的內容。所以有了這些各式各樣的協議。
其中tcp是傳輸控制協議,而udp是使用者資料報協議。
當前網際網路是以tcp/ip協議族為基礎構建的,tcp/ip協議是一系列網路協議的總稱,可以劃分為四層:
鏈路層、網路層、傳輸層和應用層。
鏈路層主要負責封裝和解封裝ip報文。
網路層通過各終端連線起來的各類網路的路徑,將ip報文傳送給目標網路或者主機、
傳輸層提供了端到端的通訊。因為網路層只能幫助將報文傳送至乙個終端,但是乙個終端不止乙個程式在聯網通訊。如何區分各個程序,這需要傳輸層的作用了。傳輸層管理了該終端的應用程式,通過報文中的傳輸層資訊它將報文分發給不同的應用程式。感覺傳輸層類似於房子裡的電氣線路,這些線路在房間的各個角落吧,提供了各種插口,也叫做socket。
而應用層負責向使用者提**用程式。這如何理解呢? 應用層協議中的協議頭這些是負責解釋協議頭後面的資料報文的。
網路應用之間是通過訊息進行相互作用的,核心就是應用協議中的資訊。
可以理解為房屋內用插頭接上這些插口的電器。
用乙個例子總結的話,將a地和b地的兩台計算機進行乙個通訊? 首先得有物理的媒介, 用什麼物理媒介? **線?光纜?有了媒介後,在媒介之上,用什麼格式的訊息進行傳輸?這就是鏈路層的作用。有了鏈路了,就好比有了四通八達的交通網。下一步就是在交通網上選擇乙個正確的路徑,將資訊傳遞到目的地。對這些路徑的抽象,就叫做圖網路。網路層就是負責在圖網路中找到路徑然後將報文傳送至目的地,網路層的核心是ip協議。那有了ip協議還是不夠的,因為網路層負責傳送到某一點,就是某乙個屋子,但是具體要到哪乙個程式呢?
這就需要傳輸層。傳輸層它管理終端的程序,它將報文傳送至具體的應用程式。 而最後的應用程式將報文進一步解包,提取出應用層協議的時候,這時候按照應用層協議的報頭規則解析協議得到正確格式的訊息。於是應用程式得以運轉。
為什麼要三次握手呢?
rfc793文件中寫到,tcp協議需要seq序列號來做可靠重傳或者接收,從而避免連線復用時候無法分別出seq是延遲或者是舊鏈結的seq。因此需要三次握手。tcp是通過seq(序列號,sequence numbers)來實現可靠連線的。tcp每傳送的乙個包,都有乙個sequence bumber,每個包都有序列號,所以能夠定位這些包並確認是否收到。由於確認機制是累計的,所以對於乙個 序列號為5的包,就意味著5之前的1-4序列號的包都是已經確認接收到的。
當tcp這條連線突然斷開之後,tcp如何識別之前舊鏈結然後重新建立連線?
所以需要乙個獨一無二的初始序列號(initial sequence number,isn)機制.因為網路不存在全域性時鐘無法知道乙個包是否是延遲到達的,
舉個列子,接收方server接收道乙個syn時,它並不知道這個syn延遲了多久,乙個包a比包b先到達server,但是b實際上有可能是比a先傳送的。
如果有client的isn,經過序列號的比較就可以按照順序拼接出完整資訊。
因此確定報文順序的辦法是端和端連線的時候採用邏輯時鐘。初始序列號isn就是邏輯時鐘的起始。isn通過syn報文傳送,client端傳送syn報文使server端得知了client的
isn,所以接下來client傳送的報文無論到達server的順序是怎樣的,server都可以通過每個報文的序列號和isn的比較來理清楚每個報文的先後順序,把這些報文拼接到一起。
而tcp協議是可靠的,這要求一方傳送,另一方必須確認。確認就是ack報文,用來確認傳送的報文的內容。所以接收方一定要向傳送方返回乙個ack。如果不確認,那就表明傳送方發給接收方的是可靠包,而接收方返回給傳送方的是不可靠包。所以client也必然再給server乙個ack。
這樣才能夠保證雙向的可靠性。所以兩次握手肯定不行,因為server在傳送了ack+syn後,client沒有回應ack,這就代表這個從server到client的連線不可靠。僅有一方不可靠是不可以建立tcp連線的。
舉例,第一次建立連線的時候, 一端生成了32位的isn,傳送方和接收方都會有自己的isn,所以client在向server傳送的是client的syn(「我的isn是***」),而server端此時回應應當用的是ack,意思是"我知道你的syn是***"。同時,server端也生成自己的syn,
然後將自己的syn和ack一併傳送給client端。最後client端再傳送ack確認報文,說我也知道了你的isn是yyy了。
至於為什麼不是四次,其實ack+syn 這一步就是合併了,提高了效率。三次握手是理論上的最小值。
綜上三次握手是必然的,因為整個網路不存在全域性時鐘,因此只能通過相對的邏輯時鐘,來確定順序。所以有乙個初始的序列號非常重要,這個序列號會決定對後面接收到的包如何排序。
建立tcp連線後,即使沒有資料傳輸也要保持連線,就是長連線;
而反之就是短鏈結。
http是無狀態的,意味著每次執行一次http操作就連線一次,但是任務執行完就斷開。
流程如下:
瀏覽器client發起並且建立tcp連線->
client傳送httprequest請求報文->
server接收到httprequest報文->
server的httphandler處理並傳送httpresponse報文給client->
傳送完畢後server呼叫socket.close關閉自己的socket物件->
client接收到報文後也會接到server端斷開tcp連線的訊號->於是client呼叫本地socket.close方法關閉。
本質上http協議不存在斷開和連線的說法。因為斷開和連線是tcp協議負責的。
tcp協議上傳輸的http協議報文是負責對http報文的內容進行解析的規則。
短連線就是指client和server建立tcp連線後,client傳送了http請求,server端向其回應了之後又給client端斷開tcp連線的訊號。
然後經過四次揮手,兩端斷開。如果client端還要進行請求,那就重新開始。
但是http1.1增加了長連線功能。但是還是無狀態的。
長連線用於操作頻繁點對點的通訊,而且連線數不能太多。比如資料庫的連線。
但是像web**一般用短鏈結,因為有大量的客戶端向其請求,如果用長連線,那麼資源開銷是巨大的。
分布式拒絕服務 攻擊。
通過控制大量的客戶端向伺服器同時發起惡意的大流量請求,對伺服器的資源超負荷占用,導致伺服器無法運轉下去從而宕機。
應對的方法有高防伺服器。專用領域的產品。
常用的是黑名單,通過防火牆或者ids進行設定,對特定的規則進行識別然後遮蔽ip。
還有就是ddos清洗,對發起請求但是一定時間內不做任何操作的ip將其踢出去。其實就是異常流量監控。統計分析流量行為,建立識別模型。
cdn加速。將**的ip隱藏,同時分散流量。
傳輸層作用
tcp和udp的區別
為什麼是三次握手而不是四次
網路連線中的長連線和短鏈結是什麼意思?
關於TCP和UDP介紹
描述一下三次握手的過程,三次握手的作用?答 首先知道tcp是一種 面向連線的 可靠的 基於位元組流 的運輸層 transport layer 通訊協議。是專門為了 在不可靠的網際網路絡上提供乙個可靠的端到端位元組流 而設計的。每一次tcp連線都需要三個階段 連線建立 資料傳送和連線釋放 三次握手 就...
關於TCP和UDP的總結
tcp udp 埠號 協議號 tcp 傳輸控制協議,可靠度面向使用者的連線。udp 使用者資料報協議,不可靠的無連線服務。埠號 為了標識上層 應用層 協議。協議號 用於標識上層 傳輸層 協議。mtu 最大傳輸單元,針對網路層資料的大小。mss 最大報文段長度,針對tcp能承載的資料大小。2.tcp資...
關於TCP打洞和UDP打洞
解決辦法是 a向b的公網ip傳送乙個資料報,則nat a能接收來自nat b的資料報並 給a了 即b現在能訪問a了 再由s命令b向a的公網ip傳送乙個資料報,則nat b能接收來自nat a的資料報並 給b了 即a現在能訪問b了 以上就是 打洞 的原理。但是tcp和udp在打洞上卻有點不同。這是因為...