① TCP那些事兒
目錄:
以前我也認為TCP是相當底層的東西,我永遠不需要去了解它。雖然差不多是這樣,但是實際生活中,你依然可能遇見和TCP演算法相關的bug,這時候懂一些TCP的知識就至關重要了。( 本文也可以引申為,系統調用,操作系統這些都很重要,這個道理適用於很多東西 )
這里推薦一篇小短文, 人人都應該懂點TCP
使用TCP協議通信的雙方必須先建立TCP連接,並在內核中為該連接維持一些必要的數據結構,比如連接的狀態、讀寫緩沖區、定時器等。當通信結束時,雙方必須關閉連接以釋放這些內核數據。TCP服務基於流,源源不斷從一端流向另一端,發送端可以逐位元組寫入,接收端可以逐位元組讀出,無需分段。
需要注意的幾點:
TCP狀態(11種):
eg.
以上為TCP三次握手的狀態變遷
以下為TCP四次揮手的狀態變遷
伺服器通過 listen 系統調用進入 LISTEN 狀態,被動等待客戶端連接,也就是所謂的被動打開。一旦監聽到SYN(同步報文段)請求,就將該連接放入內核的等待隊列,並向客戶端發送帶SYN的ACK(確認報文段),此時該連接處於 SYN_RECVD 狀態。如果伺服器收到客戶端返回的ACK,則轉到 ESTABLISHED 狀態。這個狀態就是連接雙方能進行全雙工數據傳輸的狀態。
而當客戶端主動關閉連接時,伺服器收到FIN報文,通過返回ACK使連接進入 CLOSE_WAIT 狀態。此狀態表示——等待伺服器應用程序關閉連接。通常,伺服器檢測到客戶端關閉連接之後,也會立即給客戶端發送一個FIN來關閉連接,使連接轉移到 LAST_ACK 狀態,等待客戶端對最後一個FIN結束報文段的最後一次確認,一旦確認完成,連接就徹底關閉了。
客戶端通過 connect 系統調用主動與伺服器建立連接。此系統調用會首先給伺服器發一個SYN,使連接進入 SYN_SENT 狀態。
connect 調用可能因為兩種原因失敗:1. 目標埠不存在(未被任何進程監聽)護著該埠被 TIME_WAIT 狀態的連接佔用( 詳見後文 )。2. 連接超時,在超時時間內未收到伺服器的ACK。
如果 connect 調用失敗,則連接返回初始的 CLOSED 狀態,如果調用成功,則轉到 ESTABLISHED 狀態。
客戶端執行主動關閉時,它會向伺服器發送一個FIN,連接進入 TIME_WAIT_1 狀態,如果收到伺服器的ACK,進入 TIME_WAIT_2 狀態。此時伺服器處於 CLOSE_WAIT 狀態,這一對狀態是可能發生辦關閉的狀態(詳見後文)。此時如果伺服器發送FIN關閉連接,則客戶端會發送ACK進行確認並進入 TIME_WAIT 狀態。
流量控制是為了控制發送方發送速率,保證接收方來得及接收。
接收方發送的確認報文中的窗口欄位可以用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口欄位設置為 0,則發送方不能發送數據。
如果網路出現擁塞,分組將會丟失,此時發送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制發送方的速率。這一點和流量控制很像,但是出發點不同。 流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網路的擁塞程度。
TCP 主要通過四種演算法來進行擁塞控制: 慢開始、擁塞避免、快重傳、快恢復。
在Linux下有多種實現,比如reno演算法,vegas演算法和cubic演算法等。
發送方需要維護一個叫做擁塞窗口(cwnd)的狀態變數,注意擁塞窗口與發送方窗口的區別:擁塞窗口只是一個狀態變數,實際決定發送方能發送多少數據的是發送方窗口。
為了便於討論,做如下假設:
發送的最初執行慢開始,令 cwnd=1,發送方只能發送 1 個報文段;當收到確認後,將 cwnd 加倍,因此之後發送方能夠發送的報文段數量為:2、4、8 ...
注意到慢開始每個輪次都將 cwnd 加倍,這樣會讓 cwnd 增長速度非常快,從而使得發送方發送的速度增長速度過快,網路擁塞的可能也就更高。設置一個慢開始門限 ssthresh,當 cwnd >= ssthresh 時,進入擁塞避免,每個輪次只將 cwnd 加 1。
如果出現了超時,則令 ssthresh = cwnd/2,然後重新執行慢開始。
在接收方,要求每次接收到報文段都應該對最後一個已收到的有序報文段進行確認。例如已經接收到 M1 和 M2,此時收到 M4,應當發送對 M2 的確認。
在發送方,如果收到三個重復確認,那麼可以知道下一個報文段丟失,此時執行快重傳,立即重傳下一個報文段。例如收到三個 M2,則 M3 丟失,立即重傳 M3。
在這種情況下,只是丟失個別報文段,而不是網路擁塞。因此執行快恢復,令 ssthresh = cwnd/2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。
慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增長速率。慢開始 cwnd 設定為 1,而快恢復 cwnd 設定為 ssthresh。
發送端的每個TCP報文都必須得到接收方的應答,才算傳輸成功。
TCP為每個TCP報文段都維護一個重傳定時器。
發送端在發出一個TCP報文段之後就啟動定時器,如果在定時時間類未收到應答,它就將重發該報文段並重置定時器。
因為TCP報文段最終在網路層是以IP數據報的形式發送,而IP數據報到達接收端可能是亂序或者重復的。TCP協議會對收到的TCP報文進行重排、整理,確保順序正確。
TCP報文段所攜帶的應用程序數據按照長度分為兩種: 交互數據 和 成塊數據
對於什麼是粘包、拆包問題,我想先舉兩個簡單的應用場景:
對於第一種情況,服務端的處理流程可以是這樣的:當客戶端與服務端的連接建立成功之後,服務端不斷讀取客戶端發送過來的數據,當客戶端與服務端連接斷開之後,服務端知道已經讀完了一條消息,然後進行解碼和後續處理...。對於第二種情況,如果按照上面相同的處理邏輯來處理,那就有問題了,我們來看看 第二種情況 下客戶端發送的兩條消息遞交到服務端有可能出現的情況:
第一種情況:
服務端一共讀到兩個數據包,第一個包包含客戶端發出的第一條消息的完整信息,第二個包包含客戶端發出的第二條消息,那這種情況比較好處理,伺服器只需要簡單的從網路緩沖區去讀就好了,第一次讀到第一條消息的完整信息,消費完再從網路緩沖區將第二條完整消息讀出來消費。
第二種情況:
服務端一共就讀到一個數據包,這個數據包包含客戶端發出的兩條消息的完整信息,這個時候基於之前邏輯實現的服務端就蒙了,因為服務端不知道第一條消息從哪兒結束和第二條消息從哪兒開始,這種情況其實是發生了TCP粘包。
第三種情況:
服務端一共收到了兩個數據包,第一個數據包只包含了第一條消息的一部分,第一條消息的後半部分和第二條消息都在第二個數據包中,或者是第一個數據包包含了第一條消息的完整信息和第二條消息的一部分信息,第二個數據包包含了第二條消息的剩下部分,這種情況其實是發送了TCP拆,因為發生了一條消息被拆分在兩個包裡面發送了,同樣上面的伺服器邏輯對於這種情況是不好處理的。
我們知道tcp是以流動的方式傳輸數據,傳輸的最小單位為一個報文段(segment)。tcp Header中有個Options標識位,常見的標識為mss(Maximum Segment Size)指的是,連接層每次傳輸的數據有個最大限制MTU(Maximum Transmission Unit),一般是1500比特,超過這個量要分成多個報文段,mss則是這個最大限制減去TCP的header,光是要傳輸的數據的大小,一般為1460比特。換算成位元組,也就是180多位元組。
tcp為提高性能,發送端會將需要發送的數據發送到緩沖區,等待緩沖區滿了之後,再將緩沖中的數據發送到接收方。同理,接收方也有緩沖區這樣的機制,來接收數據。
發生TCP粘包、拆包主要是由於下面一些原因:
既然知道了tcp是無界的數據流,且協議本身無法避免粘包,拆包的發生,那我們只能在應用層數據協議上,加以控制。通常在制定傳輸數據時,可以使用如下方法:
寫了一個簡單的 golang 版的tcp伺服器實例,僅供參考:
例子
參考和推薦閱讀書目:
注釋:
eg.
② 伺服器按形狀來劃分,有哪幾種類型
分為機架式伺服器(1U、2U、3U、4U、5U、7U等)、塔式伺服器、刀片式伺服器等,你可以去伺服器廠商(正睿)的網上進入伺服器頁面,看到「機構欄」,自己點選看看,一分鍾就區分清楚了!
③ 伺服器虛擬化類型有哪些
伺服器虛擬化主要有三種類型,分別為:完全虛擬化、半虛擬化、操作系統級虛擬化。
④ 用戶從FTP伺服器下載軟體後常常要進行 《》處理 A壓縮 B打包 C解壓縮 D拆包
一般都是壓縮包,需要解壓縮
⑤ socket(用tcp)數據封包拆包問題。
你抓包上來的 去除掉以太頭或者PPPOE頭後 定義一個ip_header結構體指針 計算整個負責包的長度 ip_header->total_length - ip_len -tcp_len 從ip包里讀出整個ip包長度再減掉tcp和ip頭長度,就是剩下來負載的長度,如果不是100直接 不處理
⑥ 伺服器類型分幾類
【解答】:伺服器的品牌有:
IBM Sun 惠普 戴爾 華碩 聯想
英特爾 浪潮 方正 清華同方 NEC
微星 長城 宏碁 金品 致榮 賽天
五舟 超毅定製者 曙光 ……
伺服器類型解釋及選購要考慮的因素
在信息化日益普遍的今天,若能擁有一台功能齊備,價格合理的伺服器,將是愈來愈多人關心的課題。昔日,許多人將選購一台好的PC,當作人生大事,但隨著時間流轉,科技日新月異,高性能的計算機設備不斷更新,價格也相對不斷合理化,現今無論企業或個人,都開始有機會接觸PC伺服器,企業為了節約成本,增加效率,必需使用伺服器,而個人因為資料儲存量變大,數字介面設備不斷增加,例如數字相片,圖形處理,高畫質游戲,數據備份…等的需求,也可能開始接觸入門級伺服器,因此,如何選購一台好的PC伺服器,將與許多人息息相關。
首先,我們必需了解何謂PC伺服器?所謂PC伺服器,即是Intel架構伺服器,與一些大型伺服器如Mainframe, Unix架構伺服器等不同,前者大多運行Windows或Linux等操作系統,使用較為普遍,後者多為專業用途,如銀行,大型製造業,物流業,證券…等行業使用,一般人較少有機會接觸到。一般而言,PC伺服器若以外型來分,大致可分為三類:
(一) 直立式伺服器(塔式伺服器):
為可獨立放置於桌面或地面的伺服器,大都具有較多的擴充槽及硬碟空間。無需額外設備,插上電即可使用,因此使用最為廣泛。
(二) 機架式伺服器:
為可裝上機櫃之伺服器,主要作用為節省空間,機台高度以1U為單位,1U約44mm,因空間較局限,擴充性較受限制,例如1U的伺服器大都只有1到2個PCI擴充槽。此外,散熱性能成為十分重要的因素,此時,各家廠商的功力就在此展現了。缺點是需要有機櫃等設備,多為伺服器用量較大的企業使用。
(三) 刀片伺服器:
可算是比機架式伺服器更節省空間的產品。主要結構為一大型主體機箱,內部可插上許多卡片,一張卡片即相當於一台伺服器。當然,散熱性在此非常重要,往往各家廠商都裝上大型強力風扇來散熱。此型伺服器雖然空間較節省,但光是主體機箱部份可能就所費不貲,除大型企業外較少使用。
了解了伺服器的種類之後,如何能選購一台適用的PC伺服器呢?我們可以從下列幾方面來考慮:
1. 穩定性能:
這是伺服器最重要的因素之一。然而,對許多人來說,「穩定」似乎是個十分抽象的名詞,似乎每一家伺服器廠商都在強調自己的產品十分穩定。其實,「穩定」並非完全沒有脈絡可尋,也並非貴的產品即是穩定者,筆者提供一些小技巧以供參考:
(1) 整體組裝品質: 通常較有規模的廠家所組裝的產品,有一定的品管及製造流程,因此,若可打開機箱觀察,便不難發現若是布線凌亂,機箱用料單薄,組件吻合度不佳或CPU, 內存及硬碟無原廠保固貼紙等,就絕對不該將之列入考慮范圍。
(2)良好的散熱設計: 伺服器大多需要長時間運作,因此良好的散熱性能是十分重要的。散熱性能可以由廠商數據,散熱風力強度或實際測試得知,散熱良好的伺服器往往有著較佳的穩定性能。
(3) 承諾售後服務內容: 對自己所出品的產品有信心的廠家,通常會提供較好的服務內容,
(4)整體口碑: 通常伺服器產品口碑十分重要,選擇有人推薦的品牌或市場上較老的品牌也是一種辦法。但是,有時也會有新的品牌或產品也十分優良的,這些就要靠一些專家的推薦或試用測試。
(5)權威性評比推薦: 一些權威性的雜志常常會有一些評比,也不失為一種參考依據,但最主要的還是要看一些實際運行性能測試,並多比較相關報導,才容易獲得客觀的意見。
(6) 實際測試: 如果可能的話,最好能先購買少量產品進行測試,安裝欲使用的軟體,並且可以長時間運行看看。伺服器應該要能夠長時間運行,最好去網站上下載一些測試軟體,實際運作以觀察其穩定度如何?
2. 升級維護成本:
許多品牌伺服器可能在購買時總價並不高,但卻有著十分可觀的升級維護成本。比方說,在一些國外品牌的伺服器部份,往往為了提高市場佔有率,將開始擁有成本壓的很低,但卻在一些日後升級的配件部份,如CPU,內存,硬碟,磁碟陣列卡…等十分昂貴,另外,在其原廠保固期到期後,其續約的維護成本亦十分昂貴,造成類似「買車容易養車難」的窘境。因此,這也是一個需要考慮的部份。
3. 廠家研發製造實力:
許多廠家都推出PC伺服器產品,有些價格也十分便宜,但使用者真正該考慮的應該是廠家本身的實力如何。一般來說,國際廠牌往往較具有實力,研發經驗也較豐富。重要的是,廠商自己本身要有經驗豐富的研發團隊。然而,近年來由於競爭激烈,PC伺服器價格下降不少,因此幾乎大多數的外商品牌之PC伺服器都是由其它廠商代工,因此,考量這些品牌的伺服器時,就應該排除對品牌的迷信了解其代工廠的實力及研發能力,來考量選購標准,畢竟,我們真正買到的是代工廠的產品,只是掛上品牌罷了。
4. 解決問題的能力:
雖然許多外商在研發技術方面不差,但往往因為研發部門大都在海外,當客戶發生問題時,需由當地銷售據點反應至國外總部, 這樣一來其反饋速度必然受到影響,而國內廠商的研發機構層次相對而言沒有如此復雜,是可以優先考慮的對象。
綜觀以上各點,選購一台好的PC伺服器,最重要的還是符合自己的需要,以及穩定度和售後服務的保障,當然,最有效的方式,無疑是架構一個模擬的環境,實地加以測試運作,才是最保險的方式。消費者也應該站在較為理智的立場,根據各項要點加以評估,千萬不要只是對品牌盲目的迷信,而采購了一台十分昂貴,品質卻沒有比一般品牌高出多少的伺服器。
⑦ 伺服器的類型有哪些
從外形上可以區分如下幾種伺服器種類:
方法/步驟
機架式伺服器
機架式伺服器的外形看來不像計算機,而像交換機,有1U(1U=1.75英寸=4.445CM)、2U、4U等規格。機架式伺服器安裝在標準的19英寸機櫃裡面。這種結構的多為功能型伺服器。
對於信息服務企業(如ISP/ICP/ISV/IDC)而言,選擇伺服器時首先要考慮伺服器的體積、功耗、發熱量等物理參數,因為信息服務企業通常使用大型專用機房統一部署和管理大量的伺服器資源,機房通常設嚴密的保安措施、良好的冷卻系統、多重備份的供電系統,其機房的造價相當昂貴。如何在有限的空間內署更多的伺服器直接關繫到企業的服務成本,通常選用機械尺寸符合19英寸工業標準的機架式伺服器。機架式伺服器也有多種規格,例如1U(4.45cm高)、2U、4U、6U、8U等。通常1U的機架式伺服器最節省空間,但性能和可擴展性較差,適合一些業務相對固定的使用領域。4U以上的產品性能較高,可擴展性好,一般支持4個以上的高性能處理器和大量的標准熱插拔部件。管理也十分方便,廠商通常提供人相應的管理和監控工具,適合大訪問量的關鍵應用,但體積較大,空間利用率不高。
⑧ NCP是什麼意思
NCP:網路核心協議
(NCP:Network Core Protocol)
網路核心協議(NCP)管理對 NetWare 伺服器資源的訪問。NCP 向 NetWare 文件共享協議(即NFSP:NetWare File Sharing Protocol)發送過程調用消息,處理 NetWare 文件和列印資源請求。 NCP 是用於 NetWare 伺服器和客戶機之間傳輸信息的主要協議。
NCP 主要負責處理登入請求以及其它文件系統和列印系統請求。NCP 是一種基於客戶機/伺服器的 LAN 協議。工作站建立 NCP 請求並通過 IPX 在網路上發送這些請求服務。伺服器端負責接收、拆包(unpacked)並解讀 NCP 請求。
NCP 服務包括:文件訪問、文件鎖定(file locking)、安全性、資源分配跟蹤(tracking of resource allocation)、事件通知(event notification)、與其它伺服器同步、連接和通信、列印服務,以及隊列和網路管理。
NCP 使用的是底層互聯網分組交換協議 (即IPX : Internetwork Packet Exchange Layer Services)。目前許多最新版的 NetWare(繼 NetWare 5.0 之後 )也都支持 TCP/IP 協議。
協議結構
NCP 請求頭格式如下所示:
8 16bit
Request type
Sequence number connection number low
Task number connection number high
Request code
Request type - 識別數據包類型:
1111H. 分配 slot 請求;
2222H 文件伺服器請求;
3333H 文件伺服器答復;
5555H 取消分配 slot 請求;
7777H 突發模式數據包 (BMP);
9999H 肯定確認;
H 表示十六進制符號。
Sequence number - 工作站和文件伺服器通過該欄位識別發送和接收的數據包。
Connection number low - 分配給工作站的低連接 ID 號 。
Task number - 識別操作系統 ,如 DOS , task 。
Connection number high - 分配給工作站的高連接 ID 號 。只用於 1000 用戶 NetWare 版本,其它版本上的該值都為 0 。
Request code - 識別特定請求功能代碼。
NCP 答復頭結構和請求頭結構相同,但 Connection Number High 後的最後 2 位元組不同 ,如下所示:
Completion code - completion code 欄位表示客戶機請求是否成功。 Completion Code 欄位值為 0 表示請求成功,否則表示請求出錯。
Connection status - 如果在console prompt 處輸入DOWN ,那麼 該位元組中的第四位為 1,表示關閉伺服器 。
相關協議 NetWare 、 SPX 、 RIP 、 NLSP 、 IPX
組織來源 網路核心協議 (NCP) 是 Novell 專有協議。
⑨ 伺服器是什麼 伺服器有哪些類型
伺服器是計算機的一種,它是在網路操作系統的控制下為網路環境里的客戶機提供(如PC) 共享資源(包括查詢、存儲、計算等)的高性能計算機,它的高性能主要體現在高速度的CPU 運算能力、長時間的可靠運行、強大的I/O 外部數據吞吐能力等方面。
伺服器的構成包括:處理器、硬碟、內存、系統匯流排等,和通用的計算機架構類似,但是由於需要提供高可靠的服務,因此在處理能力、穩定性、可靠性、安全性、可擴展性、可管理性等方面要求較高。
在網路環境下,伺服器主要為客戶機提供:Web應用、資料庫、文件、列印、存儲、計算等服務。簡單的說,伺服器就是在網路中為其他客戶機提供服務的計算機。
伺服器類型:
按照外形結構劃分:塔式伺服器、機架式伺服器、刀片式伺服器、高密度伺服器、機櫃式伺服器,五種類型。
按照應用層次劃分:入門級伺服器、工作組伺服器、部門級伺服器、企業級伺服器
⑩ 伺服器有幾種類型。
主機偵探來回答:
可以是按用途:
游戲伺服器
視頻伺服器
網頁伺服器
備份伺服器
資料庫伺服器等等。
也可以是按結構:
塔式伺服器
刀片式伺服器
機架式伺服器等等。
具體分為哪些種類,還是要看你分類的依據,包括但不限於上述種類。更多相關可以上主機偵探看下,像很多知名bluehost,Raksmart服務商都有優惠~