TCP协议

TCP是Transmission Control Protocol的英文缩写,意思是传输控制协议

TCP报头

源端口号和目标端口号,都是16位的,这两个端口号决定了,数据发送给哪一个应用。 包的序号是32位,给包编号的目的是解决乱序问题,通过序号确认哪一个包应该先到,哪一个应该后到。
确认序号是32位,发出去的包有个确认,这样发送方才知道对方收到了这个包,就不用重新发送了。

滑动窗口协议:tcp使用的一个基本协议是滑动窗口协议,当发送方发送一个数据段的时候,同时会启动一个定时器。当数据段到达目的地,接收方会返回一个数据段,这个数据段中包含确认号,表示收到了数据。如果发送端的定时器超时的时候,含有确认号的数据段还没到达发送端,那么发送端就会重新发送之前的数据段。

TCP连接的建立

三次握手:

  • 第一次握手:客户端发送链接请求SYN(SYN=j)包到服务端,然后tcp状态从CLOSED变为SYN_SENT,等待服务端的消息
  • 第二次握手:服务端收到SYN包之后,需要确认客户端的SYN(把ACK赋值为j+1),同时自己发送一个SYN包(把SYN赋值为k),把ACK和SYN两个都发送给客户端,然后服务端进入SYN_RECV状态
  • 第三次握手:客户端收到服务端发过来的SYN包和ACK包之后,发送给服务端确认包ACK(ACK赋值为k+1,因为服务端发过来的SYN=k所以加上一表示确认),发送完之后,客户端和服务端都进入ESTABLISHED状态,三次握手完成,tcp连接就建立起来了,双方可以开始传输数据了。

最开始客户端和服务端都是出于CLOSED状态,显示服务端主动监听某个端口,出于LISTEN状态,然后客户端主动发起SYN,之后出于SYN-SENT状态,服务端收到发起的连接,返回 SYN,并且ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。客户端收到服务端发送的 SYN 和 ACK 之后,发送ACK 的 ACK表示确认,之后处于 ESTABLISHED 状态,因为它一发一收成功了。服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。双方的信息都有去有回就认为建立成功了。

客户端状态经历了三个状态:从CLOSED 到 SYN_SENT 在到ESTABLISHED状态
服务端状态经历了四种状态:从CLOSED 到LISTEN 到 SYN_RECV再到ESTABLISHED
状态的意义:
SYN_SENT:发送连接请求之后,等待对方确认连接请求
LISTEN:监听远方tcp端口的连接请求
SYN_RECV:收到一个连接请求,而且发送一个连接请求之后,等待对连接请求的确认
ESTABLISHED:表示一个打开的TCP连接,此时可以进行数据传输了

TCP连接的释放

TCP连接是全双工的,所以每一个方向都可以单独关闭。当一方完成数据发送之后就可以发送一个FIN 来停止这个方向的连接。关闭连接一共需要四次,所以称为四次挥手。
四次挥手:

  1. 客户端发送一个FIN,表示关闭客户端到服务端的连接,然后进入FIN_WAIT1状态
  2. 服务端收到这个FIN之后返回一个ACK,确认序号是在收到的序号上加1,FIN和SYN类似,都需要占用一个序号,第二步执行完之后服务端进入CLOSE—WAIT状态,客户端收到ACK包之后进入FIN_WAIT2状态
  3. 服务端关闭与客户端的连接,并发送一个FIN给客户端,然后服务端进入LAST_ACK状态
  4. 客户端收到服务端返回的FIN包之后,客户端状态变成TIME_WAIT状态,再发送一个确认包,确认序号是收到的序号加1,发送完客户端进入CLOSED状态,服务端收到ACK包之后也进入CLOSED状态,到这一步,tcp连接彻底释放了。

整个释放的过程,客户端的状态转化:从ESTABLISHED到FIN_WAIT1,到FIN_WAIT2,到TIME_WAIT,最后到CLOSED,
服务端的状态转化:从ESTABLISHED到CLOSE_WAIT到LAST_ACK最后是CLOSED。

TCP拥塞控制机制

为什么有拥塞控制?
因为网络中的带宽、网络节点,服务器是有限的,如果有太多的数据进入到网络中,会导致超出数据链路的处理能力,服务器路由器等超负荷了,网络阻塞了可能谁的数据都无法传输了。未来避免这种最坏情况发生,需要进行拥塞控制。

拥塞控制的算法主要有:慢开始、拥塞避免、快重传、快恢复。

TCP连接的双方进行传输,这里有两个问题:一是网络容量,成为拥塞窗口,最多发送多大的数据不会导致网络被阻塞,另一个是接收方的最大容量,最大能接受多少字节的数据。一个有效的发送窗口大小是拥塞窗口和接受方最大窗口这连个窗口中最小的那一个。

慢开始算法(也成为慢启动算法slow start):核心思路是从小到大逐渐增大发送窗口,把拥塞窗口初始化为当前使用的最大数据段长度,如果数据阐述没有超时,也就是这个数据段在定时器超时之前收到了确认信号,就把拥塞窗口加倍,比如开始1k,翻倍成2k,在翻倍成4k,如果设置为8k的时候发生了超时,就改为4k,固定下来是4k。

为了防止拥塞窗口增长太快引起网络阻塞,通常会设置一个慢开始门限,当拥塞窗口的值小于慢开始门限就使用慢开始算法,如果大于慢开始门限就使用拥塞避免算法。

拥塞避免算法:思路是让拥塞窗口缓慢增加,每一轮收到确认之后,把拥塞窗口的值加1,而不是像慢开始算法那样翻倍,这样拥塞窗口就可以按照现行规律缓慢增长。

快重传算法要求接收方收到一个乱序的数据段立刻发送重复重复确认,而不是等到自己发送数据的时候再确认,如果发送方连续收到三个重复确认,就应该立刻发送对方没有收到的数据段。

参考文献

TCP的三次握手、四次挥手–非常详细讲解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值