TCP知识总结

TCP实现可靠数据传输有以下几点:

1:TCP建立连接需要三次握手, 断开连接时需要四次挥手
2:用连续ARQ协议(GBN, 选择确认)
3:流量控制
4:拥塞控制

TCP 三次握手

第一次握手: 客户端向服务器端发送SYN报文段, 并随机生成一个序号seq=client一起发给服务器端, 发送之后客户端变为SYN_SENT状态。

第二次握手:服务器收到了包含TCP SYN报文段的IP数据报之后, 服务器抽取出SYN报文段, 并为TCP缓存和变量,并向客户端发送允许连接的报文段。 服务器发送SYN=1, ACK=seq, 并生成自己的序号sever一起发送。

(SYN洪泛攻击就是利用第二次握手服务器为TCP连接分配缓存和变量实现的。)

第三次握手:客户端收到了来自服务器端的SYN报文段, 变为ESTABLISHED状态, 也为TCP分配缓存和变量(因为TCP是全双工的),因为连接已经建立了,所以发送给服务器端的报文段SYN=0, seq=client+1,ACK=sever。 第三次握手阶段可以在报文段负载携带客户到服务器的数据。

为什么是三次握手而不是两次

防止已经失的请求报文段在延迟传到之后引起资源浪费。
例:若A向B发起请求TCP连接, 因为某种原因,该TCP SYN报文段在一个网络节点逗留了很长时间, A以为该TCP SYN报文段丢失, 又重新发送了一个并成功建立TCP连接, 完成数据发送之后断开连接, 之后第一个TCP SYN报文段到达B, B就为A的TCP连接分配缓存和变量,之后一直等待A发送数据, 但此时A不知道与B建立连接, 引起了资源浪费。

TCP断开连接 四次挥手

客户端要断开TCP连接, 需要向服务器发送标志位FIN=1的报文段,客户端之后不能再向服务器端发送数据, 但可以从服务器端接收数据

服务器端收到此报文段后, 发送一个ACK表示自己已经收到。

等待服务器端没有数据发送给客户端的时候, 服务器端向客户端发送一个含有FIN=1的报文段

客户端收到后向服务器端发送ACK报文段, 等待2MSL(最长报文寿命的两倍)后关闭TCP连接, 而服务器端一收到客户端的ACK就立刻关闭TCP连接, 所以服务器端结束TCP连接会比客户端早一点

为什么TCP建立连接时是三次握手, 而关闭连接是四次挥手

因为TCP是全双工协议, 客户端向TCP发送FIN=1报文段只能说明客户端没有数据发送给服务器端了, 而不知道服务器端是否还有数据发送给客户端, 所以服务器端在收到客户端的FIN, 先发送一个ACK给客户端来表示自己已经收到了客户端的FIN报文段, 等待服务器端没有数据要发送给客户端时再向客户端发送FIN报文段,因为此时还没有数据能发送, 所以TCP建立连接时的SYN和ACK是一起发送的,所以是三次握手, 四次挥手。

为什么要等待2MSL

1:防止客户端的ACK丢失。
若客户端发送完ACK立刻关闭TCP连接并且ACK丢失, 服务器端无法正常关闭。
而若客户端发送完ACK等待2MSL的时间再关闭, 这时客户端的ACK丢失, 服务器端可以重新发送FIN给客户端, 客户端重新发送ACK来正常关闭连接。

2:防止已失效的报文段到达了重新建立的TCP连接中
客户端不等待2MSL就直接关闭TCP连接, 若此时网络中还有数据报,并且新建立的TCP连接的端口号与上一次一样, 则上一次未接收的报文段会到达新建立的TCP中。

流量控制

解决发送端和接收端吞吐量不匹配, 若发送方的发送速度大于接收方的接收速度, 等到接收方的缓存满了之后, 报文段就会丢失。

用几个变量来实现:
LastByteRead: 接收方的应用进程从缓存中读出的数据流的最后一个字节的编号。
LastByteRcvd: 从网络中到达的并且放进接收方缓存的数据流的最后一个字节的编号。
Rcvbuffer: 接受缓存的大小。
rwnd: 接收窗口的大小。
TCP不允许已分配的缓存溢出,所以
LastByteRcvd - LastByteRead <= Rcvbuffer

rwnd = Rcvbuffer - (LastByteRcvd - LastByteRead )

拥塞控制

防止过多的数据注入网络, 导致网络过载。
拥塞控制是全局的, 而流量控制是点对点的。

慢开始:

一开始发送小的数据, 由小到大的增加拥塞窗口。 每收到接收方的确认, cwnd就加倍。

拥塞避免:

设置一个慢开始门限ssthresh,
当cwnd < ssthresh 用慢开始算法
当cwnd = ssthresh 两种算法都可以
当cwnd > ssthresh 用拥塞避免算法

快重传和快恢复

重传分为两组 , 一种为超时重传, 一种为快重传。

快重传: 当连续收到三个冗余ACK时, 不必等到计时器时间到直接重传未成功接收的报文段。

快恢复:当出现超时重传或者快重传,TCP把cwnd设为原来的一半, 并把新的cwnd的值赋给ssthresh, 然后执行拥塞避免算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值