定义

TCP提供一种面向连接的、可靠的字节流服务。所谓面向连接,即应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完毕后,必须释放已经建立的连接。这个过程可以通俗的比喻成通话过程,在通话之前,必须先拨通号码,对方也必须接听,之后才可以通话。 所谓可靠的服务,即表示TCP连接传送的数据可以做到无差错,不丢失,不重复等。

握手

TCP的传输需要先建立连接,整个建立连接的过程一般称为三次握手

为什么是三次,不是两次,甚至更多

建立连接的过程是要保证双方可通信。比如邀请女神约会,我们都得先确定可以去,女神也得确定我可以去,不然谁先到约会地点就谁尴尬,容易被放鸽子。
我 –> 明天晚上可以一起看电影么? –> 女神
女神 –> 可以啊 –> 我
如果两次握手是这样的,第一,女神这边确认是可以收到消息的了,我这边是确认可以发送消息的了。但女神那侧也并不确认自己是发送成功了,那怎么判断能发送成功,只能通过我这方再次发送通知过去才可以。
我 –> 收到啦,一言为定 –> 女神
当进行了第三次握手的时候,我们双方才能确定,前两次的话是生效了,三次握手的目标就是使双方心里都有底,确保双方最基本的发送与接收功能正常。女神可以确认自己的收发能力都OK,我也确认了自己的收发能力OK,才能最基本上的保证不被放鸽子,双方心里都有底。
为什么不是更多?
因为三次握手是确保双方通信条件都OK的最基本的方式,如果更多次,当然也可以,但是,会增加网络的消耗,4次,甚至5次…N(N>5)次,也只能确保前N-1是正常的,也不能确保之后通信就是完全正常,所以3次是最好的握手判断。

三次握手的过程

TCP 报文

  1. 源端口与目的端口,各占2字节,16位
  2. 序号,4个字节,0~$$2^32$$ -1。起始序号在连接建立时设置,首部中的序号是指本报文段所发送的数据的第一个字节的序号。
    例如,一个报文段第一个字节序号是301,最后一个字节序号是400,则下一个报文段的数据序号就得401.
  3. 确认序号,4个字节,期望收到对方下一个段文段的第一个字节的序号。
    例如,收到了对方发来的报文段,序号字段是501,数据长度是200字节,则期望收到对方下一个数据序号为701,此时,就将发送给对方的确认序号设置成701.
  4. 首部长度,4位。首部长度最小为20个字节,但因为包含选项(不定长),但最大长度只能是60个字节。因为该值长度为4位,4位最大值表示15,也代表整个首部最长为60字节,选项长度最大为40字节
  5. 保留位,6位,为今后所用,目前应置为0
  6. 紧急URG(URGent)当URG = 1时,表明紧急指针字段有效,与紧急指针字段配合使用,代表该报文段中有紧急数据,需加急处理
  7. 确认ACK(ACKnowledgment)当ACK = 1时确认号字段有有效,ACK = 0时,确认号无效,在连接建立后,所有传送的报文段都必须置ACK = 1
  8. 推送PSH(PuSH)两应用程序进行交互式通信时使用,当PSH = 1时,接收方应尽快的交付接收应用进程,不用等缓存满了再向上交付。该操作很少使用
  9. 复位RST (ReSeT) 当RST = 1时,表明TCP连接中出现严重差错(如主机崩溃),必须释放连接,然后再重新建立连接。RST = 1还用来拒绝非法报文段或拒绝打开一个连接
  10. 同步SYN(SYNchronization)在连接建立时用来同步序号。SYN = 1而ACK = 0时,说明这是一个连接请求报文段。对方若同意建立连接,则应在响应报文中设置SYN = 1 ,ACK = 1.
  11. 终止FIN (FINis)用来释放一个连接,当FIN = 1时,表明报文段的发送方数据已发送完毕,并要求释放连接
  12. 窗口 2字节,用于告诉对方,允许对方发送的数据量大小,自己的缓存空间还可接收多少数据量。
  13. 校验和 2字节,检验首部与数据
  14. 紧急指针 2字节。URG = 1时配合使用,本报文中紧急数据的末尾在报文中的位置
  15. 选项 最长40字节

挥手

为什么是4次,不是3次,甚至更少

4次挥手过程

如何实现可靠性