【网络编程】【TCP】TCP协议介绍,三次握手,四次挥手,TIME_WAIT状态

       开始工作了,好久没点开CSDN,发现自己居然有81个关注的,还有很多人评论,抱歉,我基本没看见(我估计他们应该看不见),其实看见我大部分都不会,恕我知识浅薄。

       工作久了,发现自己的技术知识好像就停滞了,甚至是退步,准备拾起这个账号开始更新一些知识点,可能是读技术书学习的,可能是工作中遇到的。是对自己知识的整理,可以一种分享嘛。最近在看《UNIX网络编程》,就一边读一遍做些整理,也参考了网上其他博客。

        言归正传,下面是知识点,这篇主要是介绍TCP。

 

一、TCP介绍

        TCP 传输控制协议(Transmission Control Protocol)。是个复杂,可靠,面向连接的协议。为用户进程提供可靠的全双工字节流。TCP关心确认,超时,重传之类的细节。大多是因特网应用程序使用的都是TCP。TCP既可以使用IPv4,也可以使用IPv6.

1 面向连接

       TCP会先建立连接,再夸该连接交换数据,最后终止该链接

 

2 可靠的

         当TCP向另一端发送数据时,它会要求对端回一个ACK,如果未收到数据,那么TCP就会重传数据并等待更长时间。在数次重传失败后,TCP才放弃,一般要花费4~10分钟时间尝试发送数据。

        并且TCP会动态计算RTT时间,以便知道等待一个确认需要多少时间。RTT就说客户端和服务器之间的往返时间。

       TCP还会给每个字节关联一个序号对发送的数据排序。如果数据未按照顺序到达,TCP就会根据需要重新排序。并且在收到重复数据时,丢弃数据。

       对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才 能从套接字发送缓冲区中丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。

 

3  流量控制

       TCP会告知对端在任何时刻可以从对端接收到多少个字节,这称为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区中读取数据时,窗口大小就增大。通告窗口大小减小到0是有可能的:当TCP对应某个套接字的接收缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,方能从对端再接收数据。

 

4 全双工

       这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此,TCP必须为每个数据流方向跟踪诸如序列号和通告窗口大小等状态信息。建立一个全双工连接后,需要的话可以把它转换成一个单工连接。

 

 

二、TCP连接的建立和终止

1 三路握手

第一次握手:建立连接时,客户端发送syn包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
 

2 四次挥手

(1)某个应用进程首先调用close,我们称该端执行主动关闭(active close)。 该端的TCP于是发送一个FIN分节(seq=u),表示数据发送完毕。

(2)接收到这个FIN的对端执行被动关闭( passive close),回确认包(ack=u+1)它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

(3)服务器端传输完成数据后, 接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN(seq=w)。

(4)接收这个最终FIN的客户端,回确认包(ack=w+1)。

既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。我们使用限定词“通常”是因为:某些情形下步骤1的FIN随数据一起发送; 另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端, 有可能被合并成一个分节。

 

3 TCP分组交换

这个和之前是类似的值得注意的是在连接时,会发送MSS数据,这个是最大分节大小(maximum segment size)。就是它在本连接的每个TCP分节中愿意接受的最大数据量。而且MSS选项可以避免数据包分片。

 

4 TCP状态图

 

 

 

三、TIME_ WAIT状态

       毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME WAIT状态。在上图中我们看到执行主动关闭的那端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(maximum segment liftime, MSL)的两倍,有时候称之为2MSL。

 

1 TIME_ WAIT状态有两个存在的理由:

(1)可靠地实现TCP全双工连接的终止;

(2)允许老的重复分节在网络中消逝。

第一个理由可以通过查看图2-5并假设最终的ACK丢失了来解释。服务器将重新发送它的最终那个FIN,因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应以一个RST (另外一种类型的TCP分节),该分节将被服务器解释成一个 错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭), 那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于TIME WAIT状态的那一端: 因为可能不得不重传最终那个ACK的就是那一端。

为理解存在TIME_ WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身( incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点, TCP将不给处于TIME WAIT状态的连接发起新的化身。既然TIME_ WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。

意思就说:若无TIME. WAIT壮态,如果客户端还有消息在路上(比较慢),这时同IP和端口间又有了新的连接,那路上的未到达的消息很可能认为是新连接的消息。

 

 

四、TCP协议

1 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

2 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

3 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

4 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

5 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

字段含义
URG 紧急指针是否有效。为1,表示某一位需要被优先处理
ACK 确认号是否有效,一般置为1。
PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
RST对方要求重新建立连接,复位。
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN 希望断开连接。


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值