TCP连接原理

TCP原理(全网最详细) 万字深度解析TCP原理网络原理,全网最详细 阅读详情

HTTP 通信由 TCP/IP 承载的, TCP/IP 是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。 客户端应用程序可以打开一条 TCP/IP 连接,连接到可能运行在世界任何地方的服务器应用程序。 一旦连接建立, 在客户端和服务器的计算机之间交换的报文就永远不会丢失、 受损或失序。

1、三步握手

TCP协议目的是为了保证数据能在两端准确连续的流动,可以想象两个建立起TCP通道的设备就如同接起了一根水管,数据就是水管中的水由一头流向另一头。然而TCP为了能让一个设备连接多根“水管”,让一个设备能同时与多个设备交互信息,它必须要保证不同水管之间不会产生串联或相互影响。

为了确保数据能够正确分发,TCP用一种叫做TCB,也叫传输控制块的数据结构把发给不同设备的数据封装起来,我们可以把该结构看做是信封。一个TCB数据块包含了数据发送双方对应的socket信息以及拥有装载数据的缓冲区。

在两个设备要建立连接发送数据之前,双方都必须要做一些准备工作,分配内存建立起TCB数据块就是连接建立前必须要做的准备工作。

准备工作 

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态 

一次握手:

TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x 。

此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

二次握手:

TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

ACK为1表示确认号有效,为0表示报文中不包含确认信息

三次握手:

TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

当服务器收到客户端的确认后也进入established状态,此后双方就可以开始通信了。

注:tcp建立连接需要三次握手,SYN是发送标志位,ACK是确认标志位

为什么TCP客户端最后还要发送一次确认呢?

主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

为什么要3次握手?

换个易于理解的视角来看为什么要3次握手。

客户端和服务端通信前要进行连接,3次握手的作用就是双方都能明确自己和对方的收、发能力是正常的。

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。

  • 从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。
  • 而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。

第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。

经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。

2、TCP协议缺陷

DDOS又称为分布式拒绝服务,全称是Distributed Denial of Service。DDOS本是利用合理的请求造成服务器资源过载,导致服务不可用。常见的DDOS攻击有SYN flood(SYN flood)、UDP flood、ICMP、flood等,其中SYN flood是一种最为经典的DDOS攻击。SYN flood如此猖獗是因为它利用了TCP协议设计中的缺陷,而TCP/IP协议是整个互联网的基础,牵一发而动全身,如今想要修复这样的缺陷几乎成为不可能的事情。

SYN flood攻击原理:

  1. SYN flood在攻击时,首先伪造大量的源IP地址,分别向服务器端发送大量的SYN包。
  2. 服务器端返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答。
  3. 服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYN Time(—般为30秒至2分钟),如果超时则丢弃这个连接。
  4. 攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。
  5. 最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。

3、四次挥手

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于established(表示连接已经建立)状态,然后客户端主动关闭,服务器被动关闭。

  • 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1(FIN表示关闭连接,SYN表示建立连接),其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 
  • 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1(确认序号为收到的序号加1),并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

    CLOSE_WAIT:表示在等待关闭状态

  • 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。 
  • 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态

四次挥手简洁版:
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。这恰恰就是**2MSL( Maximum Segment Life)。

        第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

        第二,等待2MSL时间,客户端就可以放心地释放TCP占用的资源、端口号。如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的TCP报文可能与新TCP连接报文冲突,造成数据冲突,为避免此种情况,需要耐心等待网络老的TCP连接的活跃报文全部死翘翘,2MSL时间可以满足这个需求(尽管非常保守)! 

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

        建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

        关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必已经将全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

计算机网络知识详解之:TCP连接原理详解 阅读详情

相关推荐

详解TCP原理

TCP协议是一种传输层协议,也是TCP/IP协议栈中非常重要的一个协议,它提供了面向连接,可靠性传输,面向字节流等特性。使传输的效率和可靠性大大提高。可靠性是TCP协议的最核心的机制。它可以在数据传输时提供各种控制和错误恢复机制,确保数据在网络中可靠传输。TCP之所以这么复杂,就在于TCP既想要提高传输可靠性,又尽可能的保证传输的效率。校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制滑动窗口快速重传延迟应答捎带应答。

qq_63525426的博客 2878

TCP、HTTP与SOCKET连接原理

出处:http://blog.csdn.net/shenggaofei/article/details/52643376 1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次

harrain的博客 389

网络原理TCP原理

TCP 原理的十大特性详细介绍

bit me的博客 4752

到底为什么TCP 提供面向连接的服务?底层原理是什么?

TCP 提供面向连接的服务是为了确保数据传输的可靠性、顺序性和安全性。通过模拟电话呼叫的方式,我们可以更好地理解 TCP 如何建立、维护和关闭连接。而通过 Python 的socket模块,我们还可以编写简单的客户端和服务端程序来体验 TCP 通信的过程。

长风破浪会有时的博客 941

TCP连接的三次握手原理

 今天在网上找了些资料,重新温习了一下TCP连接的三次握手原理: TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后数据传送,最后拆除连接三个过程并且TCP在建立连接时又分三步走:第一步是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;第二步,

晶喜的专栏 1853

TCP连接原理网络模型

最近面试了一些大厂,都有问道通讯协议方面的东西,这里做一个系统总结 网络模型 这里对OSI模型的每一个部分做一个解释: 应用层: OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。 表示层 表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准

qq_41700030的博客 940

TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

ahuang1900的专栏 922

TCP连接和短连接原理

TCP连接TCP连接是说服务端和客户端两边通信的时候,客户端和服务端两边的端口号是固定的,一旦通道开启,就一直处于连接状态,不管客户端和服务端之间有没有数据进行发送,通道都是开启状态。 TCP连接TCP连接也是服务端和客户端之间通信的,不过跟长连接唯一不同的就是发消息的端口不固定,而且有个超时时间,比如客户端开启了一个端口向服务端发数据,当数据发完了,TCP通道也就关闭了。

u013164612的专栏 1475

HTTP长短连接TCP原理

1.长短连接介绍 HTTP短连接:客户端和服务端交互的时候每进行一次HTTP操作就建立一次连接。举例就是浏览器访问服务器去请求Web资源的时候,每请求一个Web资源,就需要建立一次连接,这个就是短连接;(HTTP/1.0默认就是短连接) 例如访问www.baidu.com这里每一个资源,如果是短连接的情况下,每一次进行HTTP操作都要重新建立一次HTTP连接 HTTP长连接:客户端和服务端交互的时候不会进行一次HTTP操作就建立一次连接。请求头标志就是Connection: keep-alive,拿上面的

weixin_39915192的博客 570

TCP连接的3次握手原理

TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后数据传送,最后拆除连接三个过程并且TCP在建立连接时又分三步走:第一步是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,

Simple is beautiful 1464

TCP传输原理、拥塞避免、连接建立、连接释放总结

 TCP、UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议。 一、UDP主要特点:传输的是用户数据报协议。 1.UDP是无连接的,即发送数据之前不需要建立连接。 2.UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。 3.UDP是面向报文的。UDP没有拥塞控制,很适合多媒

herolove的专栏 1261

基于TCP连接SYN Flooding攻击原理及防范

说起安全,不得不说一下当前最为流行的一种 DDOS 的攻击方式,从目前看来,这种攻击仍然是危害性相当大,并且没有办法彻底防范的一种攻击方式。而且,凡是基于 TCP 的高层应用,都有可能受到这种致命的攻击。        在“可靠的”传输层,在这里打上引号,是因为传输层并不是真正的可靠的,而只是相对的。为什么这么说呢,因为在 2 端的通信中,如果由于通信链路的故障,或者是某一端的故障,造成了通信的

瑞风轻拂 2897

C#.网络编程 Tcp基础(一) Tcp基本原理框架以及连接步骤

xpj8888的博客 627

什么是TCP连接?底层原理是什么?

在使用TCP连接时,客户端和服务器之间的连接不会在每个请求和响应之后关闭,而是保持连接一段时间,直到超时或关闭连接TCP连接TCP Persistent Connection)是一种在客户端与服务器之间建立一条持久的TCP连接,以便在多次请求和响应之间复用该连接,减少建立和关闭连接的时间和资源消耗,从而提高网络通信的效率。TCP连接可以大大提高网络通信的效率和稳定性,但需要注意避免连接过多导致资源浪费和服务质量下降,以及定期检查连接状态并关闭闲置连接,以避免占用过多的资源和网络带宽。

长风破浪会有时的博客 743
上一篇: HTTP报文
下一篇: TCP数据传输与性能
悠然予夏
博客等级 码龄6年 470粉丝 739原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值