一 .tcp協議的通信

tcp的通信過程分為三個步驟:建立TCP連接通道,傳輸數據,斷開TCP連接通道

下圖為tcp的通信過程示意圖:

建立tcp連接通道:三次握手

斷開tcp連接通道:四次揮手

二.詳解三次握手和四次揮手

三次握手建立連接:

第一次握手:客戶端發送tcp報文到服務器,其中syn標志位1,seq=x(x為A的初始序列號,隨機數),然后啟動計時器,等待接收服務器的應答。該報文段成為SYN報文段,不攜帶任何數據,但是消耗一個序列號。

第二次握手:服務器收到客戶端的tcp連接請求后,向客戶端發出應答報文,其中SYN標志和ASK都為零,序列號為y(y為服務端的初始序列號,隨機數),確認號為x+1,服務端也啟動計時器,等待接收客戶端的應答。這里的服務器發送給客戶端的報文段稱為SYN+ASK報文段,它不攜帶任何數據,但是消耗一個序列號。

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。

傳輸數據過程:

a.超時重傳

超時重傳機制用來保證TCP傳輸的可靠性。每次發送數據包時,發送的數據報都有seq號,接收端收到數據后,會回復ack進行確認,表示某一seq號數據已經收到。發送方在發送了某個seq包后,等待一段時間,如果沒有收到對應的ack回復,就會認為報文丟失,會重傳這個數據包。

b.快速重傳

接受數據一方發現有數據包丟掉了。就會發送ack報文告訴發送端重傳丟失的報文。如果發送端連續收到標號相同的ack包,則會觸發客戶端的快速重傳。比較超時重傳和快速重傳,可以發現超時重傳是發送端在傻等超時,然后觸發重傳;而快速重傳則是接收端主動告訴發送端數據沒收到,然后觸發發送端重傳。

c.流量控制

這里主要說TCP滑動窗流量控制。TCP頭里有一個字段叫Window,又叫Advertised-Window,這個字段是接收端告訴發送端自己還有多少緩沖區可以接收數據。於是發送端就可以根據這個接收端的處理能力來發送數據,而不會導致接收端處理不過來。 滑動窗可以是提高TCP傳輸效率的一種機制。

d.擁塞控制

滑動窗用來做流量控制。流量控制只關注發送端和接受端自身的狀況,而沒有考慮整個網絡的通信情況。擁塞控制,則是基於整個網絡來考慮的。考慮一下這樣的場景:某一時刻網絡上的延時突然增加,那么,TCP對這個事做出的應對只有重傳數據,但是,重傳會導致網絡的負擔更重,於是會導致更大的延遲以及更多的丟包,於是,這個情況就會進入惡性循環被不斷地放大。試想一下,如果一個網絡內有成千上萬的TCP連接都這么行事,那么馬上就會形成“網絡風暴”,TCP這個協議就會拖垮整個網絡。為此,TCP引入了擁塞控制策略。擁塞策略算法主要包括:慢啟動,擁塞避免,擁塞發生,快速恢復。

四次握手斷開連接:(以下的w,u,v均屬於隨機數)

第一次揮手:主動關閉方發送一個FIN=1,序號為seq=u,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但此時主動關閉方還可以接受數據。

第二次揮手:被動關閉方收到FIN包(即收到對方的釋放請求)后,發送一個ACK(確認報文)給對方,標志ASK=1,序號為seq=1,確認序號為收到序號u+1。

第三次揮手:被動關閉方接收到應用程序關閉的信息,向主動關閉方發送一個確認報文,FIN =1,ASK=1,序號為seq=w,確認序號為收到序號u+1。用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了。

第四次揮手:主動關閉方收到確認報文后像被動方發出確認報文,標志位ACK=1,序列號為seq=v+1,確認序號為收到序號即w+1,至此,完成四次揮手。

鏈接時要三次握手的理由

為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

例如:

“已失效的連接請求報文段”的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后,就誤認為是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不采用“三次握手”,那么只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,並一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。”。主要目的防止server端一直等待,浪費資源。

為什么在連接時要三次握手在斷開時卻要四次揮手

因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

四次握手時,TIME_WAIT出現的理由

1.可靠地實現TCP全雙工連接的終止。

TCP協議在關閉連接的四次握手過程中,最終的ACK是由主動關閉連接的一端(后面統稱A端)發出的,如果這個ACK丟失,對方(后面統稱B端)將重發出最終的FIN,因此A端必須維護狀態信息(TIME_WAIT)允許它重發最終的ACK。如果A端不維持TIME_WAIT狀態,而是處於CLOSED 狀態,那么A端將響應RST分節,B端收到后將此分節解釋成一個錯誤(在java中會拋出connection reset的SocketException)。

因而,要實現TCP全雙工連接的正常終止,必須處理終止過程中四個分節任何一個分節的丟失情況,主動關閉連接的A端必須維持TIME_WAIT狀態 。

2.允許老的重復分節在網絡中消逝。

TCP分節可能由於路由器異常而“迷途”,在迷途期間,TCP發送端可能因確認超時而重發這個分節,迷途的分節在路由器修復后也會被送到最終目的地,這個遲到的迷途分節到達時可能會引起問題。在關閉“前一個連接”之后,馬上又重新建立起一個相同的IP和端口之間的“新連接”,“前一個連接”的迷途重復分組在“前一個連接”終止后到達,而被“新連接”收到了。為了避免這個情況,TCP協議不允許處於TIME_WAIT狀態的連接啟動一個新的可用連接,因為TIME_WAIT狀態持續2MSL,就可以保證當成功建立一個新TCP連接的時候,來自舊連接重復分組已經在網絡中消逝。

為什么TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

linux tcp 无法握手,linux網絡編程之tcp的三次握手和四次揮手相关推荐

  1. java %3cbr%3e字符替换,Java 網絡編程之 (完全總結)

    TCP TCP,傳輸控制協議(Transmission Control Protocol),是面向連接的通信協議.它提供兩台計算機之間的可靠無差錯的數據傳輸.應用程序通過 TCP 進行通訊時,數據源和 ...

  2. php 服務器連接,cocos2d-x網絡編程 連接php服務器筆記4

    VS工程部分----網絡編程 本節會把最終實現代碼和資源放在文章最未提供各位下載學習. 本節我們開始重頭戲聯網功能的開發,我用的是cocos2d-x綁定的curl庫,這個curl據說很火,雖然我本人了 ...

  3. linux 查看握手时间,实战:tcpdump抓包分析三次握手四次挥手

    本文档以实战的形式介绍tcpdump抓包分析三次握手四次挥手的过程. 执行tcpdump命令 tcpdump -n -i ens32 host 192.168.10.10 and 42.186.113 ...

  4. TCP连接的建立和释放过程详解(三次握手、四次挥手)

    1. TCP是基于连接的协议 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.所谓面向连接,是指通信双方在进行通 ...

  5. unix network programming volume1 sorce code build and get(UNIX網絡編程卷1第三版)

    source code下载地址:unpv13e.tar.gz下载 (也有放一份在google cloud storage) compile 1. ./configure 2. cd lib make ...

  6. linux 建立http连接失败,【linux】http请求建立连接的时候为啥是tcp三次握手,而不是二次或者四次?...

    面试被问到这样的问题,求大神指教? 回答 我简单点说吧. 无论多少次握手都不能满足传输的绝对可靠. TCP的核心思想:保证数据可靠传输 其次:保证传输效率. 那么,就可以开始回答了: 为什么要握手(为 ...

  7. linux多线程编程和linux 2.6下的nptl,Linux多線程編程和Linux 2.6下的NPTL

    這幾天由於工作需要,琢磨了一下Linux下的多線程的相關資料.Linux下最常用的多線程支持庫為Pthread庫,它是glibc庫的組成部分.但是關於Pthread的說明文檔非常缺乏,特別是對POSI ...

  8. 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    来自:小林coding 每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 T ...

  9. 了解TCP的三次握手和四次挥手

    了解TCP的三次握手和四次挥手 一.    TCP/IP OSI参考模型 了解TCP的三次握手和四次挥手,我们首先从TCP/IP OSI参考模型说起. OSI(Open System Intercon ...

最新文章

  1. android 表示空字符串,Android Logcat获取空字符串时非常奇怪的行为
  2. 使用ExtJs创建新的UI控件(转)
  3. 计算机术语中CPU是指______,试题题库_计算机基础知识考试试卷全套.doc
  4. Android(Java):jni源代码
  5. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
  6. [Linux]Ubuntu 以管理员权限打开文件夹
  7. hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...
  8. 循环的各种形式(不拘一格编程序之四)
  9. jquery easy ui 1.3.4 窗口,对话框,提示框(5)
  10. 为什么出现股市二八现象?
  11. IOS自动化定位方式
  12. java反编译工具luyten、JD-GUI下载【非常详细】
  13. 某直装外挂卡密校验逆向分析
  14. 《HBase权威指南》读书笔记(一)
  15. 计算机网络基础(路由器的作用 MAC地址 IP地址 IP地址分类 子网掩码 网段,等长子网划分)
  16. 手机图片怎么压缩,简单的压缩方法
  17. ZOJ 题目分类以及部分题目简单思路
  18. Android实现校园新闻APP,基于android平台的校园新闻app的开发 大学毕业论文.doc
  19. 大数据就业前景真的那么好吗
  20. 如何像Python高手(Pythonista)一样编程

热门文章

  1. 官宣:传智播客品牌全新升级为「传智教育」
  2. java实现未读消息提醒_JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】...
  3. 刘文文:603001操盘手坐庄内幕(转)
  4. php%3e%3etxt_《3e迅雷》_3e迅雷最新版下载
  5. 三级网络技术考前复习
  6. 学习笔记1—元胞自动机(CA)模型①
  7. 怎样提升工单管理效率?
  8. 数字签名与数字信封流程
  9. 中国书法列入非物质文化遗产
  10. 计算机组成原理-chp4-指令系统