導航:首頁 > 配伺服器 > tcp伺服器1對多如何區分

tcp伺服器1對多如何區分

發布時間:2023-10-15 22:58:06

① tcp連接狀態詳解

unix的哲學是一切皆文件,可以把socket看成是一種特殊的文件,而一些socket函數就是對其進行的操作api(讀/寫IO、打開、關閉)。我們知道普通文件的打開操作(open)返回一個文件描述字,與之類似,socket()用於創建一個socket描述符(socket descriptor),它唯一標識一個socket。

當我們調用socket創建一個socket時,返回的socket描述字它存在於協議族(address family,AF_XXX)空間中,但沒有一個具體的地址。如果想要給它賦值一個地址,就必須調用bind()函數,

 sockfd即socket描述字,它是通過socket()函數創建了,唯一標識一個socket。bind()函數就是將給這個描述字綁定一個名字。
    在將一個地址綁定到socket的時候,需要先將主機位元組序轉換成為網路位元組序,而不要假定主機位元組序跟網路位元組序一樣使用的是Big-Endian。由於這個問題曾引發過不少血案,謹記對主機位元組序不要做任何假定,務必將其轉化為網路位元組序再賦給socket。
    這里的主機位元組序就是我們平常說的大端和小端模式:不同的CPU有不同的位元組序類型,這些位元組序是指整數在內存中保存的順序,這個叫做主機序。引用標準的Big-Endian和Little-Endian的定義如下:

   listen函數的第一個參數即為要監聽的socket描述字,第二個參數為socket可以接受的排隊的最大連接個數。listen函數表示等待客戶的連接請求。

  connect函數的第一個參數即為客戶端的socket描述字,第二參數為伺服器的socket地址,第三個參數為socket地址的長度。客戶端通過調用connect函數來建立與TCP伺服器的連接。

 TCP伺服器端依次調用socket()、bind()、listen()之後,就會監聽指定的socket地址了。TCP客戶端依次調用socket()、connect()之後就向TCP伺服器發送連接請求。TCP伺服器監聽到這個請求之後,就會調用accept()函數去接收請求,這樣連接就建立好了(在connect之後就建立好了三次連接),之後就可以開始進行類似於普通文件的網路I/O操作了。

 如果accpet成功,那麼其返回值是由內核自動生成的一個全新的描述字,代表與客戶的TCP連接。
 accept的第一個參數為伺服器的socket描述字,是伺服器開始調用socket()函數生成的,稱為監聽socket描述字;而accept函數返回的是已連接的socket描述字。一個伺服器通常通常僅僅只創建一個監聽socket描述字,它在該伺服器的生命周期內一直存在。內核為每個由伺服器進程接受的客戶連接創建了一個已連接socket描述字,當伺服器完成了對某個客戶的服務,相應的已連接socket描述字就被關閉。

 read函數是負責從fd中讀取內容.當讀成功時,read返回實際所讀的位元組數,如果返回的值是0表示已經讀到文件的結束了,小於0表示出現了錯誤。如果錯誤為EINTR說明讀是由中斷引起的,如果是ECONNREST表示網路連接出了問題。

 write函數將buf中的nbytes位元組內容寫入文件描述符fd.成功時返回寫的位元組數。失敗時返回-1,並設置errno變數。 在網路程序中,當我們向套接字文件描述符寫時有倆種可能。1)write的返回值大於0,表示寫了部分或者是全部的數據。2)返回的值小於0,此時出現了錯誤

 在伺服器與客戶端建立連接之後,會進行一些讀寫操作,完成了讀寫操作就要關閉相應的socket描述字,類似於操作完打開的文件要調用fclose關閉打開的文件。

 close一個TCP socket的預設行為時把該socket標記為已關閉,然後立即返回到調用進程。該描述字不能再由調用進程使用,也就是說不能再作為read或write的第一個參數

 close操作只是使相應socket描述字的引用計數-1,只有當引用計數為0的時候,才會觸發TCP客戶端向伺服器發送終止連接請求。

 我們知道tcp建立連接要進行「三次握手」,即交換三個分組。大致流程如下:

客戶端向伺服器發送一個SYN J

伺服器向客戶端響應一個SYN K,並對SYN J進行確認ACK J+1

客戶端再想伺服器發一個確認ACK K+1

socket中TCP的四次握手釋放連接詳解

 某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;另一端接收到FIN M之後,執行被動關閉,對這個FIN進行確認。一段時間之後,服務端調用close關閉它的socket。這導致它的TCP也發送一個FIN N;接收到這個FIN的源發送端TCP對它進行確認,這樣每個方向上都有一個FIN和ACK。

為什麼要三次握手

由於tcp連接是全雙工的,存在著雙向的讀寫通道,每個方向都必須單獨進行關閉。當一方完成它的數據發送任務後就可以發送一個FIN來終止這個方向的連接。收到FIN只意味著這個方向上沒有數據流動,但並不表示在另一個方向上沒有讀寫,所以要雙向的讀寫關閉需要四次握手,

    3. time_wait狀態如何避免?

首先伺服器可以設置SO_REUSEADDR套接字選項來通知內核,如果埠忙,但TCP連接位於TIME_WAIT狀態時可以重用埠。在一個非常有用的場景就是,如果你的伺服器程序停止後想立即重啟,而新的套接字依舊希望使用同一埠,此時SO_REUSEADDR選項就可以避免TIME_WAIT狀態。

1.客戶端連接伺服器的80服務,這時客戶端會啟用一個本地的埠訪問伺服器的80,訪問完成後關閉此連接,立刻再次訪問伺服器的
80,這時客戶端會啟用另一個本地的埠,而不是剛才使用的那個本地埠。原因就是剛才的那個連接還處於TIME_WAIT狀態。

2.客戶端連接伺服器的80服務,這時伺服器關閉80埠,立即再次重啟80埠的服務,這時可能不會成功啟動,原因也是伺服器的連
接還處於TIME_WAIT狀態。
實戰分析:

狀態描述:

CLOSED:無連接是活動的或正在進行
LISTEN:伺服器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉</pre>

命令解釋:

如何盡量處理TIMEWAIT過多?

編輯內核文件/etc/sysctl.conf,加入以下內容:
net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout 修改系默認的 TIMEOUT 時間</pre>

然後執行 /sbin/sysctl -p 讓參數生效.
/etc/sysctl.conf是一個允許改變正在運行中的Linux系統的介面,它包含一些TCP/IP堆棧和虛擬內存系統的高級選項,修改內核參數永久生效。

簡單來說,就是打開系統的TIMEWAIT重用和快速回收。

  本文主要講述了socket的主要api,以及tcp的連接過程和其中各個階段的連接狀態,理解這些是更深入了解tcp的基礎!

② 簡述TCP/IP協議的分層結構

TCP/IP協議並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。而TCP/IP通訊協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為: 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網路遠程訪問協議(Telnet)等。 傳輸層:在此層中,它提供了節點間的數據傳送,應用程序之間的通信服務,主要功能是數據格式化、數據確認和丟失重傳等。如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。 互連網路層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。 網路介面層(主機-網路層):接收IP數據包並進行傳輸,從網路上接收物理幀,抽取IP數據報轉交給下一層,對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送數據。 TCP/IP協議結構圖
主要協議 以下簡單介紹TCP/IP中的協議都具備什麼樣的功能,都是如何工作的: 1. IP 網際協議IP是TCP/IP的心臟,也是網路層中最重要的協議。 IP層接收由更低層(網路介面層例如乙太網設備驅動程序)發來的數據包,並把該數據包發送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP並沒有做任何事情來確認數據包是按順序發送的或者沒有被破壞。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。 高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機發送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對於一些TCP和UDP的服務來說,使用了該選項的IP包好像是從路徑上的最後一個系統傳遞過來的,而不是來自於它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連接。那麼,許多依靠IP源地址做確認的服務將產生問題並且會被非法入侵。 2. TCP 如果IP數據包中有已經封好的TCP數據包,那麼IP將把它們向『上』傳送到TCP層。TCP將包排序並進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程序和物理介質,最後到接收方。 面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發送和接收域名資料庫),但使用UDP傳送有關單個主機的信息。 3.UDP UDP與TCP位於同一層,但它不管數據包的順序、錯誤或重發。因此,UDP不被應用於那些使用虛電路的面向連接的服務,UDP主要用於那些面向查詢---應答的服務,例如NFS。相對於FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網路時間協議)和DNS(DNS也使用TCP)。 欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。 4.ICMP ICMP與IP位於同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關通向目的地址的路徑信息。ICMP的『Redirect』信息通知主機通向其他系統的更准確的路徑,而『Unreachable』信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接『體面地』終止。PING是最常用的基於ICMP的服務。 5. TCP和UDP的埠結構 TCP和UDP服務通常有一個客戶/伺服器的關系,例如,一個Telnet服務進程開始在系統上處於空閑狀態,等待著連接。用戶使用Telnet客戶程序與服務進程建立一個連接。客戶程序向服務進程寫入信息,服務進程讀出信息並發出響應,客戶程序讀出響應並向用戶報告。因而,這個連接是雙工的,可以用來進行讀寫。 兩個系統間的多重Telnet連接是如何相互確認並協調一致呢?TCP或UDP連接唯一地使用每個信息中的如下四項進行確認: 源IP地址 發送包的IP地址。 目的IP地址 接收包的IP地址。 源埠 源系統上的連接的埠。 目的埠 目的系統上的連接的埠。 埠是一個軟體結構,被客戶程序或服務進程用來發送和接收信息。一個埠對應一個16比特的數。服務進程通常使用一個固定的埠,例如,SMTP使用25、Xwindows使用6000。這些埠號是『廣為人知』的,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。
參考模型
TCP/IP協議並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網路層、傳輸層、話路層、表示層和應用層。而TCP/IP通訊協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為: 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網路遠程訪問協議(Telnet)等。 傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。 互連網路層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。 網路介面層:對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送數據。

之所以說TCP/IP是一個協議族,是因為TCP/IP協議包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等許多協議,這些協議一起稱為TCP/IP協議。以下我們對協議族中一些常用協議英文名稱和用途作一介紹: TCP(Transport Control Protocol)傳輸控制協議 IP(Internet Protocol)網間網協議 UDP(User Datagram Protocol)用戶數據報協議 ICMP(Internet Control Message Protocol)互聯網控制信息協議 SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協議 SNMP(Simple Network manage Protocol)簡單網路管理協議 FTP(File Transfer Protocol)文件傳輸協議 ARP(Address Resolution Protocol)地址解析協議 從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層、網間網層、傳輸層、應用層。 其中: 網路介面層 這是TCP/IP軟體的最低層,負責接收IP數據報並通過網路發送之,或者從網路上接收物理幀,抽出IP數據報,交給IP層。 網間網層 負責相鄰計算機之間的通信。其功能包括三方面。一、處理來自傳輸層的分組發送請求,收到請求後,將分組裝入IP數據報,填充報頭,選擇去往信宿機的路徑,然後將數據報發往適當的網路介面。二、處理輸入數據報:首先檢查其合法性,然後進行尋徑--假如該數據報已到達信宿機,則去掉報頭,將剩下部分交給適當的傳輸協議;假如該數據報尚未到達信宿,則轉發該數據報。三、處理路徑、流控、擁塞等問題。 傳輸層 提供應用程序間的通信。其功能包括:一、格式化信息流;二、提供可靠傳輸。為實現後者,傳輸層協議規定接收端必須發回確認,並且假如分組丟失,必須重新發送。 應用層 向用戶提供一組常用的應用程序,比如電子郵件、文件傳輸訪問、遠程登錄等。遠程登錄TELNET使用TELNET協議提供在網路其它主機上注冊的介面。TELNET會話提供了基於字元的虛擬終端。文件傳輸訪問FTP使用FTP協議來提供網路內機器間的文件拷貝功能。 前面我們已經學過關於OSI參考模型的相關概念,現在我們來看一看,相對於七層協議參考模型,TCP/IP協議是如何實現網路模型的。 OSI中的層 功能 TCP/IP協議族
應用層 文件傳輸,電子郵件,文件服務,虛擬終端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,RIP,Telnet
表示層 數據格式化,代碼轉換,數據加密 沒有協議
會話層 解除或建立與別的接點的聯系 沒有協議
傳輸層 提供端對端的介面 TCP,UDP
網路層 為數據包選擇路由 IP,ICMP,OSPF,BGP,IGMP ,ARP,RARP
數據鏈路層 傳輸有地址的幀以及錯誤檢測功能 SLIP,CSLIP,PPP,MTU
物理層 以二進制數據形式在物理媒體上傳輸數據 ISO2110,IEEE802。IEEE802.2
數據鏈路層包括了硬體介面和協議ARP,RARP,這兩個協議主要是用來建立送到物理層上的信息和接收從物理層上傳來的信息; 網路層中的協議主要有IP,ICMP,IGMP等,由於它包含了IP協議模塊,所以它是所有基於TCP/IP協議網路的核心。在網路層中,IP模塊完成大部分功能。ICMP和IGMP以及其他支持IP的協議幫助IP完成特定的任務,如傳輸差錯控制信息以及主機/路由器之間的控制電文等。網路層掌管著網路中主機間的信息傳輸。 傳輸層上的主要協議是TCP和UDP。正如網路層控制著主機之間的數據傳遞,傳輸層控制著那些將要進入網路層的數據。兩個協議就是它管理這些數據的兩種方式:TCP是一個基於連接的協議(還記得我們在網路基礎中講到的關於面向連接的服務和面向無連接服務的概念嗎?忘了的話,去看看);UDP則是面向無連接服務的管理方式的協議。 應用層位於協議棧的頂端,它的主要任務就是應用了。上面的協議當然也是為了這些應用而設計的,具體說來一些常用的協議功能如下: Telnet:提供遠程登錄(終端模擬)服務,好象比較古老的BBS就是用的這個登陸。 FTP :提供應用級的文件傳輸服務,說的簡單明了點就是遠程文件訪問等等服務; SMTP:不用說拉,天天用到的電子郵件協議。 TFTP:提供小而簡單的文件傳輸服務,實際上從某個角度上來說是對FTP的一種替換(在文件特別小並且僅有傳輸需求的時候)。 SNMP:簡單網路管理協議。看名字就不用說什麼含義了吧。 DNS:域名解析服務,也就是如何將域名映射成IP地址的協議。 HTTP:不知道各位對這個協議熟不熟悉啊?這是超文本傳輸協議,你之所以現在能看到網上的圖片,動畫,音頻,等等,都是仰仗這個協議在起作用啊!
編輯本段主要特點
(1)開放的協議標准,可以免費使用,並且獨立於特定的計算機硬體與操作系統; (2)獨立於特定的網路硬體,可以運行在區域網、廣域網,更適用於互聯網中; (3)統一的網路地址分配方案,使得整個TCP/IP設備在網中都具有惟一的地址; (4)標准化的高層協議,可以提供多種可靠的用戶服務。 TCP/IP模型的主要缺點有: 首先,該模型沒有清楚地區分哪些是規范、哪些是實現;其次,TCP/IP模型的主機—網路層定義了網路層與數據鏈路層的介面,並不是常規意義上的一層,介面和層的區別是非常重要的,TCP/IP模型沒有將它們區分開來。

③ TCP/IP協議分為哪幾層每層具有哪些功能

TCP/IP協議分為4個層次,自上而下依次為應用層、傳輸層、網路層、網路介面層。

各層的功能如下:

1、應用層的功能為對客戶發出的一個請求,伺服器作出響應並提供相應的服務。

2、傳輸層的功能為通信雙方的主機提供端到端的服務,傳輸層對信息流具有調節作用,提供可靠性傳輸,確保數據到達無誤。

3、網路層功能為進行網路互連,根據網間報文IP地址,從一個網路通過路由器傳到另一網路。

4、網路介面層負責接收IP數據報,並負責把這些數據報發送到指定網路上。

(3)tcp伺服器1對多如何區分擴展閱讀

TCP/IP協議的主要特點:

(1)TCP/IP協議不依賴於任何特定的計算機硬體或操作系統,提供開放的協議標准,即使不考慮Internet,TCP/IP協議也獲得了廣泛的支持。所以TCP/IP協議成為一種聯合各種硬體和軟體的實用系統。

(2)標准化的高層協議,可以提供多種可靠的用戶服務。

(3)統一的網路地址分配方案,使得整個TCP/IP設備在網中都具有惟一的地址。

(4)TCP/IP協議並不依賴於特定的網路傳輸硬體,所以TCP/IP協議能夠集成各種各樣的網路。用戶能夠使用乙太網(Ethernet)、令牌環網(Token Ring Network)、撥號線路(Dial-up line)、X.25網以及所有的網路傳輸硬體。

閱讀全文

與tcp伺服器1對多如何區分相關的資料

熱點內容
實況為什麼安卓看不了 瀏覽:129
Java多線程Queue 瀏覽:94
雲伺服器499元三年 瀏覽:980
nbd源碼 瀏覽:846
x86在arm上編譯 瀏覽:7
linux怎麼配置網路 瀏覽:307
程序員想要的小禮物 瀏覽:186
java獲取網頁url 瀏覽:624
怎麼做解壓神器泡泡版 瀏覽:966
自己動手做一個c編譯器 瀏覽:929
手機如何鏈接谷歌伺服器地址 瀏覽:137
廢掉一個程序員的武功 瀏覽:249
java樹形演算法 瀏覽:641
通達信加鎖指標源碼怎麼看 瀏覽:754
將同名文件移動到部分同名文件夾 瀏覽:403
擺盪指標加壓力線源碼 瀏覽:915
新一代單片機特徵 瀏覽:770
王者的伺服器什麼時候才修好 瀏覽:281
cad歷史命令 瀏覽:41
php博客源代碼 瀏覽:24