TCP协议:对于网络协议而言。TCP在传输层中是一个十分钟要的协议,那么什么是TCP协议呢?
TCP协议概念:
传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
以上出自维基百科。
其实对于TCP协议而言,他就是要保证双方之间的传输数据准确而有序,就是这样的一个协议服务。
所以在TCP协议中,我们首先来看一下他的报头信息:
首先我们来说一下各个数据项代表的含义:
源端口号和目的端口号:2个字节的端口号,指的是在传输层中,对应寻找的双方进程的端口,端口号必须是唯一的,根据IP:端口号,也就是套接字来实现应用数据传输。
序号:首先他的范围是[0,2^32-1]。也就是4294967296个序号,序号增加到2^32 -1 后,下一个序号就又回到了0。其实就相当于一个环形buff,mod 2^32运算,在TCP服务中,TCP面向的字节流中每一个字节都按照顺序编号。整个传输的字节流的起始序号必须要连接建立时设置。序号代表发送的第一个字节序号。
确认序号:是期望收到对方下一个保温段的第一个数据字节的序号。也是就是相当于序号到确认号-1的所有数据已正确收到,表示当前发送的数据字段已经正确接收。
数据偏移:4位,指出TCP报文段的首部长度。为什么需要他的存在,因为首部中还有长度不确定的选项字段,数据偏移最大值是60个字节,所以TCP得首部最大长度不能超过60字节,选项的长度不能超过40字节。
保留:保留为今后使用,当前设置为0.
后面是单个位的控制位:
URG:紧急指针字段的有效标识。
ACK:标识确认序号的有效性,建立连接后ACK都为1.
PSH:当两个应用进程进行交互式通信时,有时一段应用进程希望在键入一个命令后立即就能够接收到对方的响应,PSH设置为1,然后就可以立即创建一个报文段发送出去,接收方TCP收到PSH = 1的报文段。则优先推送创建的报文。
RST:RST = 1时,表明TCP连接中出现严重差错,单方崩溃,必须释放并重新进行连接。也可以拒绝非法报文的接收。
SVN:SVN = 1,ACK = 1时。表明这是一个连接请求报文段。
FIN:当FIN = 1,时,表明报文段的发送方的数据已经发送完毕,并要求释放运输连接。
窗口:2字节,代表滑动窗口的最大数据量。
检验和:2字节,检验数据正确性。
紧急指针:2字节,URG = 1时具备使用效应,支出紧急传输的数据字节。
选项:长度可变,可含有:最大报文段长度MSS,选择确认SACK【RFC 2018】,窗口扩大选项,时间戳选项【RFC 1323】。
对于TCP来说,他的报头内容包括这么多,那么他实现有效传输的内部机制都有些什么呢?
以字节为单位的滑动窗口。
超时重传的选择。
增加效率的SACK。
流量控制。
拥塞控制。
对于这些内容的详细介绍,可以看书《计算机网络第6版》谢希仁,P205-223
然后,我们了解了TCP报头的基本信息,然后我们有了解了关于TCP协议他为了实现可靠传输说实现的相关协议。了解了它相关的含义,后面,对于TCP协议来说。我们如何建立两个主机进程之间的连接呢?
首先我们来考虑一个问题:
对于双方而言,我们如果要建立一个正确的通信,我们需要对对方所发出的确认信息进行一个回应:
比如:
A告诉B我想跟你拍拖,
B表示我收到了你的信息,但是我回应你我不想跟你拍拖。
这时候问题就出现了,对于双方而言,如果单方的请求进行发送的时候,必须收到接收方的一个回应确定的话,将会出现一个令人费解的永久确定消息问题,所以,在TCP连接中,双放的连接都有着一个相对的回应请求,对于一次有效的连接而言,我们只需要
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认。
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
这就是三次握手,一段主机存在一个发送,一个接受。2端3次建立一个有效的连接。
首先客户服务端刚开始的时候都处于CLOSE状态,
当服务器启动时,变为LISTEN状态监听一切的连接请求。
当有一个客户端需要与服务器进行连接的时候,就会主动发送请求,表示当前我需要进行连接,然后发送请求连接,进入SYN_SENT,等待服务端的消息回复,
然后服务端收到客户端的连接请求,然后发出我已近收到,然后进行回复,进入SYN_RECEIVE状态,
当客户端收到服务端的消息确认后,进入ESTABLISHED,然后发送收到你的确认请求,发送回应,
服务端收到客户端的确认请求回应,进入ESTABLISHED,双方的连接就建立成功。
然后大家都能够知道的,当双方的连接建立以后,就肯定是为了传输数据而进行连接的建立,由于在TCP协议中,使用了滑动窗口,所以在断开连接的时候,客户端发送断开连接请求,但是这个时候可能在他们的通信文件之间还存在着没有来得及处理的请求,所以就进行半关闭的状态,表示我已近知道你的关闭了,但是你关闭吧,我还有事情没有做完,服务端在收到请求的时候任然不会进行关闭,继续进行未完成的数据传输,当所有数据都传输完成以后,才进行第二次通知,表示当前的我也关闭了。这个时候才发送出关闭通知请求,然后客户端进行回应,就完全关闭双方的连接。
图:
然后对于关闭来说,我们来说一下:
首先我们需要注意的是双方的状态,对于客户端来说,他的关闭处于FIN_WAIT-1,FIN_WAIT-2状态,而服务端是于CLOSE-WAIT状态,在收到B的确认之前,B进入LAST-ACK状态,最后确认状态,等待A的确认。
A收到B的连接释放报文后,进行了回复,然后进入TIME_WAIT状态,存在时间为2MSL(最长报文段寿命),对于一般的网络,MSL = 2分钟。4分钟以后才能够进入CLOSED状态,才能开始建立下一个新的连接。
其中TIME-WAIT为什么需要存在。
为了保证A卡松的最后一个ACK报文段能够到达B,因为对于任何的消息发送,都有可能发送失败,所以必须存在一段的等待时间,若出现了ACK确认报文段出现了发送失败,可以再次重传。
防止已失效的连接请求报文段出现在连接中,当A发送完最后一个ACK报文段后,在经过2MSL就可以是本连接持续的时间内产生的所有报文段都从网络消失,防止下一次连接出现上一次旧的连接请求报文。
还有一个保活计时器的设计,就是当连接建立后,客户端突然崩溃,服务器就会发送10个探测报文段,时间间隔75分钟,若发送10个以后仍然没有反应。就主动关闭连接。
TCP的有限状态机:
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
其实状态机就是表现了TCP连接的过程与服务端/客户端的一个状态变迁。