TCP协议与三次握手四次挥手详解
我们知道,TCP/IP协议族的传输层协议主要包括TCP和UDP(User Datagram Protocol,用户数据报协议)。TCP是面向连接的可靠的传输层协议,它支持在不可靠网络上的实现面向连接的可靠的数据传输。IP(网际层) 协议是一种不可靠、无连接的数据报传送服务的协议!
TCP协议的特点
1、三次握手建立连接:确保连接建立的可靠性。
2、端口号:通过端口号标识上层协议和服务,实现了网络通道的多路复用。
3、完整性检验:通过对协议和载荷数据计算校验和,保证了接收方能检测出传输过程中可能出现的差错。
4、对于正确接收到的数据,接收方通过显式应答通告发送方,超出一定时间之后,发送方将重传没有被确认的段,确保传输的可靠性。
5、序列号:发送的所有数据都拥有唯一的序列号,这样不但唯一标识了每一个段,而且明确了每个段在整个数据流中的位置,接收方可以利用这些信息实现确认、丢失检测、乱序重排 等功能。
6、窗口机制:通过可调节的窗口,TCP接收方可以通告期望的发送速度,从而控制数据的流量。
TCP封装
TCP收到应用层提交的数据后,将其分段,并在每个分段前封装一个 TCP头。最终的IP包是在TCP头之前再添加IP头形成的。
TCP头的格式。由一个20B的固定长度部分加上变长的选项字段组成。TCP头的各个字段含义如下:
(1) 源端口(Source Port):16 位的源端口字段包含初始化通信的端口号,源端口和源IP地址的作用是识别报文的返回地址。 (2) 目的端口(Destination Port):16位的目的端口字段定义传输的目的地址,这个端口指明接收方计算机上的应用进程接口。 (3) 顺序号(Sequence Number):该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第一数据字节在整个字节流中的序号。如果将字节流看做在两个应用进程间的单向流动,则TCP用序列号对每个字节进行计数,序列号是一个32位的数。
(4) 确认号(Acknowledgement Number):TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节在整个字节流中的序号,并声明此前的所有数据都已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被在设置时才有效。
(5)数据偏移(Data Offset):这个4位字段包括TCP头大小,以32位数据结构(字)为单位。
(6)保留(Reserved,阴影部分):6位置0的字段。为将来定义新的用途保留。
(7)控制位(Controlbits):共6位,每1位标志可以打开一个控制功能,这6个标志从左至右是URG(Urgent pointer field significant,紧急指针字段标志)、ACK (Acknowledgment field significant,确认字段标志)、PSH(Push function,推功能)、RST(Reset the connection,重置连接)、SYN(Synchronize sequence numbers,同步序列号)、 FIN(Final, No more data from sender, 数据传送完毕)。
? ① URG 表示 TCP 包的紧急指针字段有效,用来保证 TCP 连接不被中断,并且督促中间层设备要尽快处理这 些数据。
? ②ACK 取值为1时表示应答字段有效,也即 TCP应答号将会包含在TCP 段中;为0则反之。
? ③PSH 表示 Push 操作。所谓 Push 操作就是指在数据包达到接收端以后,立即传送给应用进程,而不是在缓 冲区中排队。
? ④ RST 表示连接复位请求,用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
? ⑤ SYN 表示同步序号,用来建立连接。
? ⑥FIN 表示发送端已经发送到数据末尾,数据传送完成,发送FIN 标志位的TCP段后,连接将被断开。
(8) 窗口(Window):目的主机使用16位的窗口字段告诉源主机它期望每次收到的数据的字节数。窗口字段是一个16位字段。
(9) 校验和(Checksum):TCP头包括16位的校验和字段用于错误检查。源主机基于部分IP头信息、TCP头和数据内容计算一个校验和,目的主机也要进行相同的计算,如果收到的内容没有错误,两个计算结果应该完全一样,从而证明数据的有效性。
(10) 紧急指针(Urgent Pointer):紧急指针字段是一个可选的16位指针,指向段内的最后一个字节位置,这个字段只在URG标志被设置时才有效。
(11) 选项(Options):至少1B的可变长字段,标识哪个选项(如果有)有效。如果没有选项,这个字节等于 0,说明选项字段的结束。这个字节等于1表示无需再有操作:等于2表示下4个字节包括源机器的最大段长度(Maximum Segment Size,MSS)。 MSS数段机器机器对此成一致。当一个 TCP连接接SS,协可以输的最大段长度。常见的MSS有1024B,以太网可达1460B。
(12)填充(Padding):这个字段中加入额外的零,以保证TCP头是32位的整数倍。
(13)数据(Data):从技术上讲,它并不是TCP头的一部分,但应该了解到,数据字段位于紧急指针和选项字段之后,填充字段之前。字段的大小是最大的 MSS,MSS可以在源和目的机器之间协商。数据段可能比MSS 小,但却不能比MSS 大。
TCP的连接建立与拆除
? TCP 协议是一个面向连接的可靠的传输控制协议:在每次数据传输之前需要首先建立连接,当连接建立成功后才开始传输数据,数据传输结束还要断开连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,双方通过说“喂”确认可以通话后才开始通话。
? 由于TCP使用的网络层协议IP是一个不可靠、无连接的数据报传送服务,为确保连接的建立和终止都是可靠的,TCP使用3次握手的方式来建立可靠的连接,也就是说其中交换了3个消息;结束 TCP 连接则采用4次握手来实现。TCP 使用报头中的标志同步段来描述创建一个连接的3次握手中的消息,用结束段来描述关闭一个连接的消息。另外,握手过程确保TCP只有在两端一致情况下,才会打开或关闭一个连接。创建一个连接的3次握手过程中要求每端产生一个随机32位序列号,因为每一个新的连接用的是一个新的随机序列号。
下面介绍3次握手和4次握手的过程。
(1):由发起方 HostA 向被叫方 HostB发出连接请求。将段的序列号标为a,SYN置位。由于是双方发的第一个包,ACK 无效。
(2):HostB 收到连接请求后,读出序列号为a,发送序列号为b的包,同时将 ACK置为有效,将确认号置为a+1,同时将SYN置位。
(3):HostA 收到HostB的连接确认后,对该确认再次确认。HostA 收到确认号为a+1序列号为b的包后,发送序列号为a+1、确认号为 b+1的段进行确认。 (4):HostB 收到确认报文后,连接建立。
这样,一个双向的TCP连接就建立好了,双方可以开始传输数据。 下面来讨论3次握手过程是如何保证连接的可靠性的。如果接收方HostB在收到发送方 HostA 的连接请求分段a后,发送确认分段b并等待数据。由于其使用的网络层协议IP是不可靠的,可能使得该确认信息丢失,这样会使得发送方HostA认为接收方没有确认,而事实上接收方正在等待发送方传数据分段确认。为避免接收方的盲目等待,接收方 HostB 要收到发送方 HostA 对它的确认后才开始等待,如果没有收到的发送方 HostA 的确认,它将认为它自己的确认丢失,因而将反复重传刚发过的确认分段b。对于发送方 HostA 也一样,在收到接收方HostB的确认后立即对 HostB的确认再做确认,然后开始发数据。如果HostA发送的对 HostB 的确认a+l 传递丢失了,HostB 不会认为连接已建好,而发送方 HostA 却会开始发送数据 a+2,面对这种故障可能性,是否要求 HostB 对 a+1 确认,而 HostA 收到此确认后再传a+2呢?没有必要。因为如果进行更多的确认,连接可靠性无疑会不断增加,但这样会消耗更多的连接时间,并且如果HostB没有收到 a+1,它会反复重传以前的确认分段 b,HostA 也可以借此意识到需要重新发送a+1 确认。这样,在效率与可靠性的权衡中,TCP选择了3次握手建立连接,在尽可能保证连接的可靠性的前提下也保证了一定的效率。
当数据传输结束后,需要断开TCP连接。 (1)HostA 要求终止连接,发送序列号为p的段,FIN 置为有效,同时确认此前刚收到的段。
(2)HostB收到 HostA发送的段后,发送ACK段,确认号为p+1,同时关闭连接。
(3)HostB发送序列号为q的段,FIN 置为有效,通知连接关闭。
(4)HostA 收到 HostB发送的段后,发送ACK段,确认号为 q+1,同时关闭连接。 TCP连接至此终止。可见这是一个4次握手过程。 TCP的连接用的全双工模式,大家可以去了解一下
|