TCP协议

TCP协议的作用

TCP协议是为了两端两个进程之间,数据传输的安全问题而制定的传输层协议。数据传输之间会有数据丢失、数据重复、乱序等问题。

TCP建立连接

TCP协议为了确保数据传输的安全为什么要建立连接呢?

两端建立连接之后,可以根据连接维护一个数据结构,通过这个数据结构去做一些维护数据安全的操作。比如说ip1:8081连接上了ip2:8082,在ip1端就会保存一个类似key->value的记录,ip1:8081–ip2:8082–>数据结构,这个数据结构缓存一些根据序号排列好的数据包。根据缓存里面的数据包就能知道哪些包丢失、重复、乱序了。

为什么建立连接需要3次握手呢?

3次握手是指,两端建立连接一共发了3个包。建立连接的前提两端互相知道对方是存活的且能接收到数据。是下面通过类别打电话来解释为什么建立来连接要发3个包。
客户端:听得到吗?
服务端:听得到。你能听得到我讲话吗?
客户端:我也听得到。

如果发两个包就建立了连接,会有什么问题呢?

客户端发了第一个包请求建立连接,但是服务端没有及时回复包,然后客户端就一直重复发送请求包,直到服务端回复了包,如果此时建立了连接,第一个问题,是服务端不知道此时是否存活,是否能接收到它的信息;第二个问题是,如果两端已经传输完了数据,并且把连接关闭之后,客服端重复发的请求建立连接的包到达了服务端,服务端就会误以为客户端又发起了建立建立连接的请求,服务端就发送回复包,建立了连接,但是客户端是没有建立连接的,此时客户端和服务端的连接状态就不一致了。

TCP连接过程

在这里插入图片描述
(1)客户端请求建立连接,SYN=1,随机序号seq=J,客户端状态是SYN_SENT。
(2)服务端应答请求,并且请求建立连接。SYN=1,ACK=1,ack=J+1,seq=K。ACK=1表明这是一个应答,应答号是J+1,说明是应答了客户端seq=J的请求包;SYN=1表明是一个请求,请求序号是一个随机序号K。此时服务端状态是SYN_RCVD。
(3) 客户端应答服务端的请求。ACK=1,ack=K+1表明应答的是服务端seq=K的包。此时客户端的状态是ESTABLISHED,服务端接收到应答包后,状态也变成了ESTABLISHED。

TCP头部信息

在这里插入图片描述
TCP头部以4个字节为单位,其中有20个固定字节,选项长度可变,不过长度一般为0,所以头部的长度一般为20个字节。
(1)源端口号和目标端口号,各占2个字节,通过它们找到收发放的应用进程。
(2)序列号,2个字节。发送包的序号,开始序号是随机的,之后的序号递增,
(3)确认应答号,2个字节。期待发送方发送包的序号,也是对少于这个序号的包的应答。
(4)首部长度,4位,表示包头部的长度。
(5)窗口大小,发送窗口取接收窗口和拥塞窗口的最小值。
(6)ACK,值为1表示这个包是确认包,确认序号ack才生效。
(7)SYN,值为1表示请求建立连接的包。
(8)FIN,值为1表示请求释放连接。
(9)RST,值为1表示连接异常,重新建立连接。

流量控制

流量控制主要是控制传输的总量,就是通过窗口参数,告诉发送方,我这边还能接收多少个包,不能传输超过这个数量的包,不然我这边接收不了。

拥塞控制

拥塞控制主要是为了防止网络拥挤导致丢包。网络拥挤的特征是丢包重传。
现在介绍拥塞控制的方法。首先是进行慢启动,慢启动算法是拥塞窗口值cwnd=1,设置一个慢启动阈值ssthresh,假设是ssthresh=8,cwnd一直指数上升,+1,+2,+4,直到达到了阈值,然后进行拥塞避免操作,缓慢增加拥塞窗口的值,每次只增加1,直到出现丢包重传,然后把ssthresh设置成出现拥塞时拥塞窗口大小的一半,从慢启动开始重新之前的操作。
但是丢包重传网络不一定就是出现了网络拥塞,如果不是出现网络拥塞,重新从慢启动开始发送数据,这会传输速率变慢。于是出现了快速重传和快速恢复。快速重传是发送方没有等待包超时再重传,接收方会重复3次ACK,ack是丢失包的序号,当发送方接收到3次重复的ACK,就会重传丢失的包,这个时候就不会重新从慢启动开始传输数据。而是进行快速恢复,ssthresh设置成出现拥塞时拥塞窗口大小的一半,把ssthresh的值作为拥塞窗口的初始值,每次增加1。

四次挥手

在这里插入图片描述
(1)客户端发送一个FIN包,请求断开连接,表明客户端已经没有数据发给服务端了,但是服务端还可以发数据给客户端。客户端状态变成FIN_WAIT_1。
(2)服务端应答客户端的FIN包,服务端状态变成CLOSE_WAIT,客户端接收到服务端的应答,状态变成FIN_WAIT_2。
(3)服务端发送FIN包,请求断开连接,服务端状态变成LAST_ACK。
(4)客户端应答服务端的FIN包,状态变成TIME_WAIT,服务端接收到客户端的应该,断开连接,变成CLOSED状态。客户端的TIME_WAIT是担心,应答包没有传到服务端,保留重传的时间。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值