详解TCP协议

TCP的主要特点:

1、TCP是面向连接的运输层协议。在应用程序使用TCP之前,必须要建立TCP连接。在数据交互完成之后,必须要进行释放连接,不然之前建立的连接的端口会被内核维护,使得不能再使用这个端口号了。整个过程就像是在打电话:打电话前,必须要进行拨号建立连接,才能进行通话,通话结束之后就要进行挂机释放连接,不然电话线路一直占用着,其他的电话打不进来。
2、每一条TCP连接只能够有两个端口。每一条连接都只能是点对点、一对一的。所以广播和多播的应用程序不能使用TCP协议。
3、TCP提供可靠的交付的服务。通过TCP连接传输数据,无差错、不丢失、不重复,按序到达。
4、TCP提供全双工通信。TCP允许通信双方的应用程序在任何时候进行数据的交互。在通信双方都设有缓冲区,用来存放双向通信的数据。在发送时应用程序将数据传送到缓冲区,GTCP在合适的时候将数据发送出去。接收时,TCP将数据放入缓冲区,在合适的时候将数据读取出来。
5、面向字节流。TCP中的流指的是流入到进程或从进程流出的字节序列。

TCP协议报头分析:

在这里插入图片描述
16位的源端口号:发送源的端口号

16位的目标端口号: 目标的端口号

32位的序号:交互的初始数据段,序号值由系统生成的随机值:ISN。后续的报文段的序号为ISN+所携带数据在整个字节流中的偏移量。特点:1、所有的报文段序号不重复。2、后续的报文段序号值比前面的大。

32位的确认号:由接收段填充,其值为序列号+1+报文段所携带的数据长度。作用:1、向发送方确认已收到的报文段。2、通知发送端下一个要接收的报文段的序号值为多少。
4位的头部长度:指出TCP的报文段的数据起始位置距离TCP报文段的起始处有多远。起始就是指TCP的头部长度。它的单位是32位的字(4字节),所以最大为 15 * 4 = 60 字节 ,其中固定部分为20字节,扩充部分40字节。

6位的标记位:
URG :当其值为1的时候,告诉系统此报文段中有紧急数据,应该尽快传送,不要按之前的排队顺序来传送。和紧急指针配合使用。
ACK :当其的值为1的时候,确认号才有效,TCP规定,在建立连接以后,所有传送的报文段bout必须要把ACK置为1。
PSH:告诉接受方立即将缓冲区的数据交付,不要等到缓冲区满了之后才交付。
RST:当其值为1时表示TCP连接出现了严重的错误,必须释放连接,重新建立连接。还可以用来拒绝一个非法的报文段或拒绝打开一个连接。
SYN:在连接时用来同步序号,当SYN=1,ACK=0时,表示这个是一个请求连接的报文段。对方若同意建立连接,则在相应报文上讲SYN=1,ACK=1。其值置为1表示这是一个连接请求或连接接受报文。
FIN:用来释放一个连接,当FIN=1时,表示此报文段为发送方的数据已发送完毕,要求释放运输连接。

16位的窗口:由接收方来填充,告知发送法本段接收缓冲区的空闲的大小;

16位的校验和:校验不仅包括头部还有数据段也要进行校验。在校验的时候要加上12字节的伪首部。

紧急指针:当URG=1时才有效, 指出了紧急数据的末尾在报文段的位置。


TCP的连接和关闭:

每一条TCP都有两个端点,这个端点就是套接字(socket)/插口,将端口号拼接到IP地址就构成了套接字。端口和IP地址之间用冒号或者逗号隔开。

TCP的连接就是我们常说的三次握手,关闭就是四次挥手,如下图所示:
在这里插入图片描述
连接: 客户端先向服务器发送一个连接请求SYN,然后服务器也发送一个SYN报文,同时确定客户端发送的请求表示,同意连接。客户端接收到服务器发送的确认请求的时候,也发送自己的确认报文。这时客户端已经连接上了。当服务器端接收到客户端的确认报文的时候,服务器端也连接上了,两端就可进行相互通信了。
提问:
为什么必须要是三次握手,两次为什么不行?

答:如果是两次握手的话,当客户端第一次发送的请求报文段,因为网络延迟的原因,在超时定时器到期之前都没有收到服务器段的确认报文,就重发请求报文。那么服务器可能会收到两份请求报文,因为服务器不能识别是不是同一份报文,所以服务器会当做是两个连接,就会发送两个确认报文。客户端接收到两个确认报文时,因为客户端知道,它只向服务器请求了一次连接,所以对两个服务器发送的确认报文中,后到达的报文会被丢弃。由于只是两次握手,所以此时就已经建立好了连接。那么在服务器看来,会维护两个连接,而客户端只有一个连接,这样服务器就会白白浪费一次没有用的连接的资源。
但是如果是三次握手的话,在客户端接受到服务器端发送的确认报文的时候,只会发送一条确认报文给服务器,而不会是两条,当服务器接收到客户端发送的确认报文的时候,也只会建立一条连接而已。
为什么服务器不能识别相同的报文,而客户端就可以?
答:因为对客户端来说,它想连接的对象只有一个,收到的消息,只能是服务器发送的,所以当收到相同的报文段时,就能够识别出来。而对于服务器来说,它只是被动的接受连接,可以是多个客户端同时请求和服务器进行连接,且请求报文段是不带数据的,所以不同的客户端发送的请求报文段可能是一样的,所以服务器不能判断这个报文段是同一个的。

关闭:
在关闭阶段,就不分服务器端和客户端了,不管是哪方都可以请求关闭连接。所以我们分为主动断开方和被动断开方。主动断开方先是发送一个FIN报文段,表示它已经没有数据要发送了,希望关闭连接,此时主动方处于FIN_WAIT_1状态。当被动方接受到该报文段时,会发送一个确认报文段,此时被动方处于CLOSE_WAIT状态。主动方接收到被动方发送的确认报文,就会处于FIN_WAIT_2状态。这时,被动方还是可以发送数据给主动方,当被动方也也没有数据要发送的时候,就会发送FIN报文段给主动方。被动方进入LAST_ACK 状态。 这时,当主动方接收到FIN报文段时,会发送一个确认报文段给被动方,表示知道它也要关闭连接。之后主动方并没有直接关闭连接,而是进入一个叫TIME_WAIT状态,经过2MSL(Max Segment Life 报文段最大生存时间 经过这段时间之后,表示在网络中没有这两方发送的数据),才关闭连接。而被动方接收到主动方发送的确认报文的时候,就处于关闭状态。

特殊情况:两方同时发送FIN报文段,那么当他么都发送了确认对方的FIN报文段的确认报文段之后,都会进入CLOSING 状态。之后再收到对方发送的确认报文段就进入TIME_WAIT 状态。等到2MSL时间到了之后,就关闭连接。

提问:
三次挥手行不行?

答:是可以的。当被动方接受到主动方发送的FIN报文段,发送确认报文段的同时,也加上FIN标志,表示被动方也没有数据要发送了。这时,主动方接收到的带FIN标志的确认报文段,给被动方发送确认报文段之后,就会直接从FIN_WAIT_1进入TIME_WAIT状态。这时,就只是三次挥手了。

TIME_WAIT状态:
存在的原因:
①可靠地关闭连接
当确定报文段6的报文段7丢失之后,被动方会在发送一个报文段6,只时如果主动方处于关闭状态,这谁来处理这个重发的报文段6,所以需要一个状态在处理这种情况,否则主动方重复收到结束报文段会返回一个ret报文段来处理,这是被动方会认为这是一个错误,因为,它期望的是报文段7。
②用来处理迟来的报文段,识别,并丢弃。
TIME_WAIT状态时,我们无法使用当前连接占用的端口号来建立一个新的连接,因为linux内核会维护这个端口号,且在linux系统上,一个TCP端口号不能同时打开两次以上。如果没有这个转态的话,我们可以用这个端口号,重新建立一个和之前相似的连接(相同的IP地址、和端口号)。这时,迟来的报文段,可能会会被新的连接所接收,这是我们都不希望看到的。

TCP的可靠性传输:
1、数据能够到达接受端 (由确认机制和超时重传机制保证)
2、数据不能乱序(由32位的序号保证)
3、数据不能被损坏,无差错(由16位的校验和 CRC冗余校验保证)

停止等待协议:
1、无差错的情况:
如下图所示:
在这里插入图片描述

发送方A将报文M1发送给接收方B,接收方B在收到了报文之后,给发送方A发送一个确认报文;之后这按照这种方式发送报文M2和M3。
2、出现差错的情况:
如图:
在这里插入图片描述
发送方A发送分组M1的时候在中途出现的错误,接收方B在收到这个错误的报文的时候就会将这个报文丢弃。或者报文M1在发送的途中丢失了,这两种情况下,接收方多不会发送任何消息给发送方。这时就需要需要一种机制来解决这种问题,而这种机制就是超时重传。
       超时重传方案就是发送方每发送一个报文段,会启动一个计时器,当定时器超时,就会立即重传之前的报文段数据;如果在计时器结束之前收到接收方发来的确认信息,将会撤回这个计时器。定时器时间每发送同一个报文段,如果是重传的话,定时器会增大到原来的一倍。(比如第一次2s,第二次就4s,第四次就8s…)需要注意:①要实现超时重传,就要让发送方在发送一个数据报之后,不要立刻将数据报删除,而是放在缓冲区里,防止出现超时重传,只有等到接收到接收方发送的确认报文,才能将数据报清除。②计时器的时间要适当,不能太长也不能太短,一般都是在超出平均往返时间一些。太长的话,可能会出现网络拥塞;如果太短的话,确认报文在正常的传输途中,发送方就重发了报文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值