Socket網路程式設計之TCP

2021-10-03 14:15:18 字數 3549 閱讀 2194

如果要用一句話總結tcp是什麼,我想應該是:tcp是網際網路運輸層的面向連線的、可靠的、基於位元組流的、全雙工的運輸協議

tcp運輸層協議服務

在分析tcp服務之前需要說明tcp在網路協議分層中處於哪個層次,下圖是tcp/ip協議族的四個層次:

tcp和udp都使用相同的網路層(ip),但是tcp向應用層提供了和udp完全不同的服務,tcp提供了一種面向連線的、可靠的位元組流服務。

一旦建立起乙個tcp連線,兩個程序之間就可以互相傳送資料了,這裡模擬一下客戶程序向伺服器程序傳送資料的情況,如下圖:

從上圖可以看出,客戶端程序通過套接字(socket)傳遞資料流。套接字將資料傳入客戶端執行的tcp控制之後,tcp就會將資料引導到該鏈結的傳送快取中,傳送快取是在三次握手初期設定的快取之一。當資料進入傳送快取之後,tcp就會不時的從傳送快取取出一塊資料,tcp應該在它方便的時候以報文段的形式傳送資料。

最大報文段長度(mss)

最大報文段長度通常根據最初確定的由本地傳送主機傳送的最大鏈路層幀長度來設定,最大鏈路層幀長度即所謂的最大傳輸單元(maximum transmission unit)。mss=mtu-20位元組tcp報頭-20位元組ip報頭。乙太網和ppp鏈路層協議都具有100位元組的最大傳輸單元,因此mss的典型值為:1500-20-20=1460位元組。

tcp報文段由首部欄位和乙個資料字段組成,如下圖所示:

如上圖所示,資料字段包含一塊應用資料,就如上段內容所說,mss限制了報文段資料字段的最大長度。當tcp傳送乙個大檔案時,tcp通常會將檔案分為mss大小的若干塊。

首部包括源埠號和目的埠號,被用於多路復用/分解來自或送到上層應用的資料,tcp首部也包括校驗和字段。

ugr:緊急指標有效

ack:確認序號有效

psh:接收方應該盡快將這個報文段交給應用層

rst:重建連線

syn:同步序號用來發起乙個連線

fin:發端完成傳送任務

可以看到視窗大小只有16位,也就是最大視窗大小是65535個位元組(64kb),tcp的流量控制就是由連線兩端通過宣告的視窗大小來提供。

校驗和貫穿了整個tcp報文段,即tcp首部和tcp資料。校驗和是乙個強制性的字段,一定是由發端計算和儲存,由接收端進行驗證。

我們知道tcp是面向連線的協議,那麼什麼是長連線?什麼是短連線?什麼是連線?

長連線就是當實現客戶端和服務端連線成功後可以連續地傳輸資料,這個過程中連線保持開啟的狀態,並且資料即使傳輸完畢連線也不會關閉。在socker通訊中是指建立socket連線後,無論是否使用該連線,連線都保持連線的狀態。

短連線就是什麼時候需要傳輸資料就建立連線,當資料傳輸完畢,該連線也就不存在了。如果想再次傳輸資料,需要重新建立新的連線。

連線是在tcp/ip中,連線是客戶端和服務端確認彼此存在的過程,要實現這個過程,就需要客戶端和服務端建立連線,建立連線需要客戶端和服務端進行三次握手,只有握手成功之後,雙方才能進行通訊。

長連線的優缺點:

優點:

我們知道長連線建立之後,客戶端不需要再每次傳輸資料時建立連線,這樣就減少了握手確認時間,提高程式效率。

缺點:

在伺服器端儲存了多個socket物件,大量占用伺服器資源。

短連線的優缺點:

優點:

對應長連線的缺點,短連線不需要在伺服器端儲存多個socket物件,降低記憶體佔用率。

缺點:

缺點也是對應長連線的優點,在每次通訊時都需要建立新連線,進行三次握手增加處理時間,降低程式使用率。

三次握手

三次握手顧名思義就是通過三次資料交換建立連線,具體實現如下圖所示:

通過三次握手確認的主要資訊是約定好雙方後續通訊需要的起始序列號、視窗縮放大小等資訊。下面對三次握手做乙個簡單的介紹。

發端通常是客戶,傳送乙個syn段指出客戶打算連線的收端(伺服器端)的埠,以及初始序列,這個syn端為之前介紹的報文段1。

收端作為回應,發出包含伺服器的初始化序列syn,同時將確認序號ack設定為客戶端請求時isn加1以對客戶的syn報文段進行確認,syn占用乙個序列號。

類似於伺服器確認客戶端syn資訊,客戶必須將確認序號設定為伺服器的isn加1以對伺服器的syn報文段進行確認。

三次握手用我們日常生活中的例子來總結,類似於我們一次簡單的發快遞服務,流程如下:

在快遞平台填寫基本資訊,提交給物流公司(類似於三次握手第一次握手)。

快遞員打**確認基本資訊(類似於第二次握手)。

快遞員上門取件,確認資訊(類似於第三次握手)。

其實各種技術源於生活,服務於生活,在學習時在生活中都能找到非常多的例子,這樣可以幫助記憶、理解。

我們知道在網路通訊中,udp協議是不可靠的,tcp是可靠的,那麼什麼機制保證了tcp協議的可靠性了,具體原因如下:

通過上述所描述的機制,確保了乙個程序從其接收快取中讀出的資料流是無間隔無損壞非冗餘按序的資料流;即該接收端接收到的位元組流和傳送端發出的位元組流是完全相同的。

tcp是一種位元組流協議,流的定義沒有固定的邊界,可以是二進位制資料,也可以是ascii字元或者其他型別資料。tcp對位元組流的內容不做任何解釋,對位元組流的解釋由tcp連線雙方的應用層負責。

發端和收段通過tcp連線交換位元組流,tcp不在位元組流中插入任何記錄標識資訊,這就是tcp的位元組流服務。

tcp提供的是全雙工服務,即連線兩端可以是這樣的形式:客戶端/接收端,接收端/客戶端,也就是說連線通訊的雙方既可以接收資料,也可以傳送資料。例如:一台主機上的程序a和另一台主機上的程序b存在tcp連線,那麼應用層資料可以從a流向b,也可以從b流向a。

tcp提供的服務總是點對點的連線,即是單個傳送方和單個接收方的連線,絕對不會存在多播的情況發生。

tcp 是乙個可靠的(reliable)、面向連線的(connection-oriented)、基於位元組流(byte-stream)、全雙工(full-duplex)的協議。

留乙個思考題:對於一次**交談,哪一方是主動開啟?哪一方是被動開啟?是否允許同時開啟?是否允許同時關閉?

網路程式設計之socket

套接字 socket 是乙個抽象層,應用程式可以通過它傳送或接收資料,可對其進行像對檔案一樣的開啟 讀寫和關閉等操作。套接字允許應用程式將i o插入到網路中,並與網路中的其他應用程式進行通訊。網路套接字是ip位址與埠的組合。套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 unix...

網路程式設計之socket

1,socket 通訊 服務端 import socket server socket.socket server.bind 127.0.0.1,8080 server.listen 5 conn,addr server.accept data conn.recv 1024 print data c...

網路程式設計之socket

1 是什麼?socket又稱套接字,是能夠實現程序間通訊的乙個 東西 2 為什麼?socket是對tcp ip協議的乙個封裝,相當於軟體設計模式中的外觀者模式 socket作為按鈕,按鈕內部連線著tcp ip的若干個對應的協議,也其實可以簡單理解為socket內部封裝著與tcp ip參考模型中各層進...