1. 程式人生 > >TCP協議中,Client和Server是如何通訊的?三次握手中第一次傳送的內容是什麼?

TCP協議中,Client和Server是如何通訊的?三次握手中第一次傳送的內容是什麼?

原博主加入了很多抓包圖來解釋這個過程,鄙人看不懂抓包的內容,不過大致流程還是看明白了,所以就把抓包部分給去掉了,覺得會好理解一些。

TCP/IP協議分層

這個問題就要從TCP/IP協議說起了,先來看看TCP/IP協議是如何分層的。
TCP/IP協議分層圖

  • 鏈路層,也稱作資料鏈路層或者網路介面層,通常包括作業系統中的裝置驅動程式和計算機中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。

  • 網路層,也稱作網際網路層,處理分組在網路中的活動,例如分組的選路。網路層協議包括IP協議(網際協議)、ICMP協議(Internet網際網路控制報文協議),以及IGMP協議(Internet組管理協議)。

  • 運輸層,主要為兩臺主機上的應用程式提供端到端的通訊。在TCP/IP協議族中,有兩個互不相同的傳輸協議:TCP(傳輸控制協議)UDP(使用者資料報協議)
    TCP為兩臺主機提供高可靠性的資料通訊。它所作的工作包括把應用程式交給它的資料分成合適的小塊交給下面的網路層,確認接收到的分組,設定傳送最後確認分組的超時時鐘等。由於運輸層提供了高可靠性的端到端通訊,因此應用層可以忽略所有這些細節。
    而另一方面,UDP則為應用層提供一種非常簡單的服務。它只是把稱作資料報的分組從一臺主機發送到另一臺主機,但並不保證該資料報能到達另一端。任何必須的可靠性必須由應用層來提供

  • 應用層,負責處理特定的應用程式細節。包括Telnet(遠端登入)、FTP(檔案傳輸協議)、SMTP(簡單郵件傳送協議)以及SNMP(簡單網路管理協議)等。

TCP(傳輸控制協議)通訊

TCP是一種面向連線(連線導向)的、可靠的基於位元組流的傳輸層通訊協議。TCP將使用者資料打包成報文段,它傳送後啟動一個定時器,另一端收到的資料進行確認、對失序的資料重新排序、丟棄重複資料。

TCP的特點有:

  1. TCP是面向連線的運輸層協議
  2. 每一條TCP連線只能有兩個端點,每一條TCP連線只能是點對點的
  3. TCP提供可靠交付的服務
  4. TCP提供全雙工通訊。資料在兩個方向上獨立的進行傳輸。因此,連線的每一端必須保持每個方向上的傳輸資料序號。
  5. 面向位元組流。面向位元組流的含義:雖然應用程式和TCP互動是一次一個資料塊,但TCP把應用程式交下來的資料僅僅是一連串的無結構的位元組流

TCP建立連線時,會有三次握手過程,如下圖所示:
TCP三次握手過程
下面來逐步分析三次握手過程:

  1. 第一次握手:客戶端向伺服器傳送連線請求包,標誌位SYN(同步序號)置為1,序號為X=0
  2. 第二次握手:伺服器收到客戶端發過來報文,由SYN=1知道客戶端要求建立聯機。向客戶端傳送一個SYN和ACK都置為1的TCP報文,設定初始序號Y=0,將確認序號(Acknowledgement Number)設定為客戶的序列號加1,即X+1 = 0+1=1
  3. 第三次握手:客戶端收到伺服器發來的包後檢查確認序號(Acknowledgement Number)是否正確,即第一次傳送的序號加1(X+1=1)。以及標誌位ACK是否為1。若正確,伺服器再次傳送確認包,ACK標誌位為1,SYN標誌位為0。確認序號(Acknowledgement Number)=Y+1=0+1=1,傳送序號為X+1=1。客戶端收到後確認序號值與ACK=1則連線建立成功,可以傳送資料了。

TCP四次揮手

TCP斷開連線時,會有四次揮手過程,如下圖所示:
TCP四次揮手
下面來逐步分析四次揮手過程:
1. 第一次揮手:客戶端給伺服器傳送TCP包,用來關閉客戶端到伺服器的資料傳送。將標誌位FIN和ACK置為1,序號為X=1,確認序號為Z=1。
2. 伺服器收到FIN後,發回一個ACK(標誌位ACK=1),確認序號為收到的序號加1,即X=X+1=2。序號為收到的確認序號=Z。
3. 伺服器關閉與客戶端的連線,傳送一個FIN。標誌位FIN和ACK置為1,序號為Y=1,確認序號為X=2。
4. 客戶端收到伺服器傳送的FIN之後,發回ACK確認(標誌位ACK=1),確認序號為收到的序號加1,即Y+1=2。序號為收到的確認序號X=2。

最後,我找了一張整個過程TCP傳輸過程的示意圖,如下圖所示:
整個TCP過程示意圖
此圖轉載自 TCP協議中的三次握手和四次揮手(圖解)

相關推薦

TCP協議ClientServer是如何通訊的?握手第一傳送內容是什麼?

原博主加入了很多抓包圖來解釋這個過程,鄙人看不懂抓包的內容,不過大致流程還是看明白了,所以就把抓包部分給去掉了,覺得會好理解一些。 TCP/IP協議分層 這個問題就要從TCP/IP協議說起了,先來看看TCP/IP協議是如何分層的。 鏈路層

TCP通訊BufferedWriterPrintWriter用來實現輸出流的實現方式與區別

區別: 1. PrintWriter的print、println方法可以接受任意型別的引數,而BufferedWriter的write方法只能接受字元、字元陣列和字串; 2. PrintWriter的println方法自動新增換行,BufferedWrite

Socket TCP 協議實現服務端客戶端的簡單通訊-結合線程池的使用

文章目錄 前言 當前模式的弊端 服務端程式碼 客戶端程式碼 執行結果 客戶端 服務端

http協議“get”“post”的區別是什麼?

http協議中,“get”和“post”的區別是什麼? GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 你可能自己寫過無數個GET和POST請

clientserver簡單基礎版之建立套接字完成通訊

TCP建立套接字連結通訊,知識點學習如下連結:https://www.cnblogs.com/zhanggaofeng/p/5869053.html 客戶端程式碼 #include<sys/socket.h> #include<arpa/inet.h> #inclu

TCP clientserver 程式例子(轉)

tcp和udp的程式就不貼了,網上例程太多,放在附件裡。下面分別說一下流程和細節tcp服務端流程:1、建立socket(socket函式)2、設定服務端sockaddr_in結構體,並繫結到第一步的socket(bind函式) 3、設定客戶端資訊佇列長度,也就是已經建立連線

tcp協議報文握手與四揮手

tcp報文 三次握手與四次揮手 tcp11種狀態tcp協議:tcp是面向連接、可靠的進程到進程之間的協議。tcp提供全雙工服務:即:數據可在同一時間雙向傳輸。tcp報文段首部格式:各字段含義:源端口號:16位字段,為發送端進程對應的端口號目標端口:16位字段,為接收端進程對應的端口號,接收方接收到數據

在活動目錄轉移占用操作主機角色(占用)

操作主機 ad 轉移 占用 楊書凡 如何占用操作主機操作主機是ActiveDirectory中的特殊對象,具備操作主機角色的域控制器擔任著活動目錄核心功能,如果操作主機不可用,整個活動目錄都會出現異常,甚至崩潰。 操作主機角色的唯一性決定了不是任意一臺域控制器都能管理整個域,當一臺承

為什麽TCP在高時延丟包的網絡傳輸效率差?

TCP 協議 丟包 說明:有同學私信問到,為什麽TCP在高時延和丟包的網絡中傳輸效率差? Google可以搜到很多的信息,這裏轉譯了部分IBM Aspera fasp技術白皮書的第一章節內容,作為參考。 -在這個數字世界中,數字數據的快速和可靠移動,包括全球範圍內的大規模數據傳送,對於幾乎所有行

第五節:SignalR大雜燴(與MVC融合、全局的幾個配置、跨域的應用、C/S程序充當ClientServer)

融合 變化 方法 signalr 以管理員身份運行 cal 大小 整合 ref 一. 說在前面的話   本節主要在前面章節的基礎上補充了幾個簡單的知識點,比如:第三方調用通過 GlobalHost.ConnectionManager.GetHubContext<

form表單提交確定取消效果的實現

前端開發中的資料提交,目前大多數採用表單提交的方式,但是對於很對初學者來說,只知道在表單格式中,只有一個<input type="submit">,如果有兩個或者要求有多個提交選擇的時候應該怎麼做呢,其實用js就可以簡單實現: 例如下面的效果: 有一個確定和取消的

在prootbuf StringQByteArray互相轉換

在做專案中,應用到protobuf,通訊採用的是TCP,開發平臺是Linux和Windows下的Qt5.11.2。由於Qt TCP傳輸資料型別是QByteArray,而protobuf需要將資料轉換成string。 在正常使用過程中,QByteArray和string都可以採用以下方式進

談IO的阻塞非阻塞同步非同步及種IO模型

什麼是同步和非同步?        燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這麼發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。隨著科技的發展,現在市面上的水壺都有了提醒功能,當我們把水壺插電

Tcp協議的3握手與4揮手過程分析

轉載https://blog.csdn.net/u012824097/article/details/52490091 客戶端與服務端的通訊中步驟 1建立Tcp連線 3次握手 2再進行資料傳輸 3資料傳輸完成後,斷開連線。

TCP協議特點握手/四揮手

TCP的特性 TCP提供一種面向連線的、可靠的位元組流服務 在一個TCP連線中,僅有兩方進行彼此通訊。廣播和多播不能用於TCP TCP使用校驗和,確認和重傳機制來保證可靠傳輸 TCP給資料分節進行排序,並使用累積確認保證資料的順序不變和非重複 TCP使用滑動視窗機制來實現流量控

python-numpy.arrayany()all()方法介紹

0.摘要 本文主要介紹numpy.array.any()和numpy.array.all()的用法和區別。 1.np.array.any()和numpy.array.all() np.array.any()是或操作,將np.array中所有元素進行或操作,然後返回T

springrefidref標籤之間的區別?

ref和idref標籤在定義上的區別: idref標籤:注入的是目標bean的id,同時使用idref容器在部署的時候還會驗證這個名稱的bean是否真實存在。idref就跟value一樣,只是將某個字串注入到屬性或者建構函式中,只不過注入的是某個Bean定義的id屬性值。

在try-catch-finally語句returnfinally的關係

public class TestTryCatch { public static void main(String[] args) { TestTryCatch test = new TestTryCatch(); int fun = test.fun();

Linux.a.so其實就是靜態連結庫與動態連結庫

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

HibernatemappedBy註解@JoinColumn的對比

mappedBy 我們知道,mappedBy用於指定具有雙向關係的兩個實體中。哪個實體是被關聯處理的。它有如下四個特點: 1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性; [email&#