TCP协议

TCP协议

在学习网络的时候,我们知道TCP协议一种在传输层的协议,与之对应的还有UDP协议,TCP协议的特点如下:

  1. 有连接的
  2. 面向字节流的
  3. 保证数据传输的可靠性
  4. 全双工的通信方式

其中,保证数据传输的可靠性是它最大的特点,那么如何保证,我们下面来看一看,TCP协议的报头信息。
这里写图片描述
他们代表的含义分别是:
1.源端口和目的端口:都占用两个字节,代表发送主机端口和接收方目的端口,和UDP一样,TCP的分用功能也是通过端口号来实现的。
2.序列号:TCP是面向字节流的,因此在传输过程中的每一个字节都需要按顺序编号,首部中的序号字段则是指的是表示本段报文中所发送的数据的第一个报文的序号。
3.确认号:占四个字节,是期望对方收到的下一个报文段的第一个数据字节的序号,总之记住,确认号为N的时候,那么到序号为N-1的数据都以及成功收到。
4.数据偏移:这个字段提出TCP报文首部的长度,最大表示60个字节,也就是说TCP选项不能超过40个字节。
5.保留:占6位,保留为今后所用,但现在应该设置为0.
6.URG(紧急):当URG为1的时候,表示启用紧急指针位,告诉系统此时有紧急的数据需要传送,应尽快传送,优先级高于其他报文,把紧急数据插入到本报文的最前面,要和紧急指针位配合使用。
7.ACK(确认):只有当ACK为1的时候,确认号才有用,ACK为0的时候,确认号无效。TCP规定:当建立好连接之后,所有的报文ACK都必须设置为1.
8.PSH(推送):在两进程交互通信的时候,有时候希望一端的应用程序键入一个命令之后,马上收到对方的回应,在这时,TCP就可以使用PUSH,发送方讲PUSH置1,然后发送给接收方,接收方发现报文PUSH为1,就马上交付给上层应用程序,不必等待缓冲区满再向上进行交付。
9.RST(复位):RET为1,表示TCP连接出现了严重的错误,必须释放连接,然后再重新建立连接。
10.SYN(同步):当SYN为1,ACK为0,表示这是一个连接请求,如果同意连接,那么则在响应报文中设置SYN为1,ACK为1。因此SYN为1表示这是一个连接请求或者接收连接请求。
11.FIN(终止):用来释放连接,当FIN为1的时候,表示该报文的发送发数据已发送完,并请求释放连接。
12.窗口:占2个字节,窗口指的是发送该报文的一方告诉对方自己的一个接收窗口大小,窗口明确指出了运行对方发送给的数据量,并且窗口还用于进行流量控制,因此是时常变化的。
13.校验和:占2字节,TCP和UDP一样,在计算校验和的时候,会在首部加上12个字节的伪首部,检查的范围包括首部和数据两部分。
14.紧急指针:当URG为1的时候,紧急指针为指向需要紧急发送的数据的尾部,发送紧急数据,当紧急数据发送完成后,回到正常,注意当窗口为0的时候,也是可以进行紧急发送的。
15.选项:长度可变,最大长度为40,

可靠传输

TCP协议做到可靠传输的是通过下面几点:

  1. 超时重传,当发送的数据没有超过规定时间没有得到响应的时候,会重新发送报文。
  2. 数据校验。
  3. 选择确认。

流量控制

一般情况,我们希望传输的速率越快越好,但是如果发送方一直在发送,而接收方来不及接收,就会造成数据的丢失,合理的调节这两者的工作效率就叫做流量控制。
我们一般是通过滑动窗口来实现流量的控制。
当接收方来不及接受报文的时候,它就会缩小自己的窗口大小,来进行流量控制,当窗口大小为0的时候,发送方讲不再发送数据。
并且设置一个持续计时器,一旦设置的时间到了,就会发送一个探测窗口报文,只携带一个字节,接收方会回复一个当前窗口大小的响应,如果窗口还是0,那么就重置持续计时器,一旦窗口大小不为0,那么就打破了死锁的僵持状态。

拥塞控制

一旦网络出现拥堵,将大大降低传输的效率,当网络吞吐量明显小于理想的吞吐量时,就发生轻度拥塞,而当网络吞吐量为0的时候,那么网络就无法进行工作,形成死锁。
为了解决拥塞控制,1999年规定了4种避免拥塞的方法:慢开始,拥塞避免,快重传,快恢复。
这里写图片描述


三次握手,四次挥手

TCP协议是面向连接的,下面我们来看看这个过程,我们把建立连接的过程称之为“三次握手”,把释放连接的过程称之为“四次挥手“。
这里写图片描述

这三次握手的具体细节如下:
1.A主机发出连接请求,发送一个报文,其中SYN=1,同时选择一个初始序列号seq=x,这个报文不携带数据。
2.如果B主机统一建立连接,那么就会发送一个SYN=1,ACK=1,,ack=x+1的响应报文,表示同意连接。同时,也为自己选择一个初始序列号seq=y;
3.A主机收到B主机的统一请求之后,还要向B发出确认信息,报文信息包括SYN=1,ACK=1,ack=y+1,seq=x+1。
4.B主机接收到确认信息之后,连接建立完成,两台主机就可以进行数据交互了。
这个过程形象的比喻,就像A和B打电话的时候,A先说,你可以听到我说话嘛?(第一次握手),B回到说:我可以听到,你能听到我说话嘛?(第二次握手),A此时回答:我可以听到(第三次握手)这三次过程就是为了保证通讯双方建立了正确的连接,可以相互通信。

下图是四次挥手的过程:
这里写图片描述

具体细节如下:
1.当A主机传送完成数据的时候,它主动请求释放连接的报文,其中FIN=1,seq=u,那么A的应用进程先向它的TCP发送释放连接报文,然后停止发送数据,主动关闭A到B的连接。这时候A进入到TIME_WAIT_1,等待B的确认。
2.B主机接受到释放连接请求的时候,确认号是ack=u+1,而这个报文的序号是seq=u,然后B进入CLOSE_WAIT状态,此时TCP通知高层应用A释放了连接,此时处于一种半关闭的状态,B还可以向A发送数据,把剩余没发完的数据继续发送给A。
3.当A接受到B确认之后,就进入TIME_WAIT_2状态,等待B发送的连接释放报文段。
4.如果B没有数据向A发送了,应用程序就会通知TCP释放连接,这时发送的报文FIN=1,假设现在的B序号为W,B还必须要回复上一次的已发送的确认号ACK=U+1,
此时,B进入到最后确认状态,等待A的确认。
5.A在收到B的连接关闭请求的时候,必须做出回应,在确认报文中ACK=1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入TIME_WAIT状态,注意此时,TCP连接还没有释放,必须经过时间等待器设置的2MSL时间之后,再进入CLOSE状态,B接收到确认报文后,关闭连接。
这个过程也可以形象的比喻成A和B打电话的过程,当A和B快说完准备挂的时候,A说,我要说的以及说完了,准备挂电话了。(第一次挥手),B说我知道了,等一下,我还有一点点事要给你说…(第二次握手),当B把最后的一点事情说完了之后,他说:我说完了,现在你可以挂电话了。(第三次挥手)。B说:好的,那我挂了。(第四次挥手)。
TCP协议的三次握手和四次挥手就基本保证了安全的建立好了数据连接。那么为什么需要三次挥手和四次挥手,而不是别的呢?
为什么会采用三次握手,若采用二次握手可以吗?
采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。所以只能最少采用三次握手,两次握手会出现问题。采用了三次握手,A就不会像B的确认发出确认,这样B就知道A没有要求建立连接,B就不会发送数据了。
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
原因是因为TCP是全双工模式,因此每个方向都需要一个FIN和ACK,当一端发送了FIN包之后,处于半关闭状态,此时仍然可以接收数据包。
在建立连接时,服务器可以把SYN和ACK放在一个包中发送。
但是在断开连接时,如果一端收到FIN包,但此时仍有数据未发送完,此时就需要先向对端回复FIN包的ACK。等到将剩下的数据都发送完之后,再向对端发送FIN,断开这个方向的连接。
因此很多时候FIN和ACK需要在两个数据包中发送,因此需要四次握手 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值