计算机网络(自顶向下学习笔记)---运输层(二)

一、TCP连接的性质

1、面向连接的协议:发送有效载荷之前两进程必须先相互握手。这种连接是一条逻辑链接,其共同状态仅保存在通信的两个端系统的TCP程序中。TCP工作在端系统上,中间的网络元素压根儿看不见TCP报文,也不会维持TCP连接状态。

2、TCP连接组成包括:主机上的对应的套接字、缓存、变量,不包括中间的任何网络元素。发送方从它的发送缓存中取出一定长度的应用数据(这受限于MSS,MSS又进一步受限于MTU),然后配上TCP首部,从而形成TCP报文段传给网络层,网络层再将其封装在IP数据报中传输至网络上。

二、TCP报文段结构

|源端口号|目的端口号|
| 序 号 | 序号:是该报文段第一个字节的字节流编号
| 确 认 号 | 确认号:是A填充的进报文段的,代表期望从B收到的下一个报文的序号。
4比特首部长度字段,单位是32比特,TCP首部长度可变,但典型长度是20字节
16比特接受窗口字段,用于流量控制
标志字段:ACK, RST,SYN,FIN, CWR,ECE, PSH,URG

三、超时重传

1、超时重传的时间间隔:显然必须大于RTT,它是利用统计学方法实时对RTT采样计算的,会随着信道状态实时动态变化。

2、TCP采用一种文雅的方式,即超时后时间隔加倍。定时器过期往往是因为网络拥塞,太多的分组在网络中的某一路由器的队列中,造成分组丢失或长时间的排队时延,如果此时持续重传分组,只会使情况变得更糟糕。

3、立即重传:超时重传可能会带来特别长的时间周期,而冗余ACK机制可以使报文在超时之前重传。接收方收到失序报文后,不会发送否定确认,只是对已经接受到的最后一个按序报文进行冗余确认,发送发收到3个冗余确认之后会立即重传!

注意!接收方会缓存这个失序报文,而对它的确认包含在未来按序报文的累计确认当中。

四、GBN还是SR?

TCP的差错恢复机制中并没有明确规定到底是使用GBN的“确认到第一个丢失字节之前(变成累计确认)”,还是SR的“保留失序字节,并等待缺少的字节以填补间隔”。

值得一提的是,有一种方案叫做选择确认,这是GBN和SR的混合体,但更像SR即有着一定程度上的累计确认,又有使接收方缓存失序分组的能力,从而接收方只重传未被确认的字段。这就需要在建立TCP连接时在首部中增加SACK选项字段以便告知不连续字段的边界[RFC2018]。

五、流量控制

1、流量控制与拥塞控制采取的动作非常相似,都是一系列对发送方的遏制而采取的措施,但是它们完全有着不同的原因:前者是为了使发送方的发送速率与接收方对缓存的读取速率匹配,而后者使为了避免IP网络的拥塞。

2、接收窗口变量rwnd就是前者所引入的机制,一个主机通过把当前的rwnd放入报文段的接收窗口字段,通知另一个主机“接受缓存还有多少可用的空间”。cwnd拥塞窗口是发送方根据当前网络的情况用CCA计算得出的,最终这两个窗口合力限制发送窗口,进而达到遏制发送方的速率
注意!TCP是全双工的,因此实际上双方都有发送接受拥塞窗口

3、UDP并不提供流量控制,因此如果进程从缓存中读取报文段的速率不够快,那么缓存就会溢出,报文段就会被丢弃。

六、拥塞控制

1、TCP采用端到端的拥塞控制方法,即此时假设IP不会向端系统提供有关网络拥塞的信息。

  • 发送方的TCP维护一个拥塞窗口变量cwnd,发送方的发送窗口应小于等于min{cwnd,rwnd}
  • 丢包事件定义为:要么发生超时,要么收到3个冗余的ACK。此时应当使窗口收缩,降低发送方的速率。
  • 收到一个确认报文代表着该网络正在以当前交付报文给接收方,此时应当使窗口变大增加发送方的速率
  • TCP是自计时的,一个报文的确认的速度影响着拥塞窗口打开的速度。

2、拥塞控制算法慢启动和拥塞避免是AIMD的强制部分,快速恢复是推荐部分 。算法设置一个阈值,开始慢启动,加性增,乘性减

  1. 慢启动:cwnd以1MSS开始并且每当一个传输的报文段被首次确认就增加1MSS。如果没有发生丢包,结果就是每过一个RTTcwnd就翻倍一次。指数增长

  2. 拥塞避免:cwnd已经超过了实现设定的阈值,如果cwnd继续翻倍增长可能有些鲁莽。所以此时选用更为谨慎的方式:如果没有发生丢包,结果就是每过一个RTTcwnd只增加1MSS。

  3. 快速恢复:把cwnd设置为当前阈值+3(3个冗余的ACK),然后随RTT线性地增长

模式切换有三种情景

  • cwnd到达了当前的发送阈值后进入拥塞避免模式。

  • 发生超时丢包时,立即将阈值设置为当前cwnd的一半,进入新的慢启动。 Tahoe

  • 发生冗余ACK丢包时,立即将阈值设置为当前cwnd的一半,进入快速恢复模式 Reno

3、明确拥塞通告:ECN,是一种网络辅助的拥塞控制协议。网络层IP数据包首部中有ECN标记位,在传输的过程经过拥塞的路由器时会被设置。端系统上的TCP根据IP首部ECN设置TCPACK报文中的ECE字段,当发送发看到ACK报文中的ECE被置1后得知此时网络是拥塞的,会减半拥塞窗口类似于快速重传。

注意!此时的网络(尚能收到ECE和冗余ACK)网络状况明显优于超时情况的网络,故拥塞窗口改变地并没有那么剧烈!

七、TCP连接的动作

1、连接建立
TCP的连接建立很重要,它会显著地增加人们感受到的时延。客户应用进程通知客户端TCP,它想建立一个与某个服务器上某个进程的TCP连接:

  1. 客户发送SYN报文段放入IP数据报到服务端,这个报文段不含任何应用层数据,SYN=1,具有一个客户端随机生成的初始序号client_isn

  2. 服务端从IP数据报中取出SYN报文段,如果服务端允许本次连接它会为本次连接分配缓存和变量,并发送SYNACK报文段给客户端,这个报文段也不含任何应用层数据,同步号SYN=1,确认号ACK=client_isn+1和一个服务端随机生成的初始序号server_isn。

  3. 客户端接受到SYNACK报文之后才会分配本次连接的缓存和变量,实际上这时本次TCP连接的资源已经充足了,所以接下来客户端发送的报文可以含有应用层数据了,SYN也变成了0。
    注意!这是一个可靠的连接,所以客户端发报文的ACK从server_isn+1开始,如果服务端不发送这个ACK,服务器会在一分多钟后收回为本次分配的资源

2、连接的断开
因为此时双发都处于活跃状态(全双工),所以比较繁琐双方都可以提出断开连接,效果是对称的

  1. 当客户端没有要发送数据了,想要断开连接的时候,它会发出一个FIN报文给服务端但是如果服务器还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据

  2. 服务端接受到FIN报文时,可能有数据(也可能没有)正要发送给客户端,因此不能立即释放连接,所以此时仅仅也必须返回一个ACK报文: 你的请求我收到了,等我消息。

  3. 当Server端确定数据已发送完成,则向Client端发送FIN报文,“好了,我这边数据发完了,随时可以关闭连接”。

  4. Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道真的要关闭了,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。注意!Server端收到ACK后才真正断开连接。Client端等待了2MSL后依然没有收到回复那好,Client端才真正断开连接。

Q1:为什么挥手多了一次?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

Q2为什么关闭时要等待?

1、为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN的确认报文。服务器会超时重传这个FIN,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

2、客户端在发送最后一个ACK之后,再经过经过2MSL,就可以尽量使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

Q3 什么是SYN泛洪攻击?如何防御
攻击方发送大量的SYN报文段,而不完成第三次握手,服务器不断为这个半开连接分配资源直至消耗殆尽。一种有效的防御系统叫做SYNCookie,因为合法的用户总是会返回一个ACK报文(第三次握手),在这时利用Coookie就能判断该ACK是否对应于较早的SYN报文,服务器进而决定是变成全开的连接还是收回分配的资源。

3、RST位
1、当本主机接受到一个TCP报文段,它的端口号或源IP无法与本机上任何一个套接字匹配时,它会向源发出一个重置报文段,RST位置为1:我没有接受那个报文的套接字请不要向我再发送它了

2、UDP没有RST位,所以当UDP报文与套接字不匹配时,则会发送回一个ICMP数据报。

八、公平性

1、理想情况假设每条TCP连接有着相同的RTT和MSS,AIMD会使得TCP最终会收敛到平分链路带宽的状态,即这个算法是公平的。

2、在实践中,网络应用往往会获得非常不平等的带宽份额:那些具有小RTT的TCP连接可以更快打开cwnd,抢到链路带宽,因而将比哪些具有较大RTT的连接享有更高的吞吐量。

3、UDP从不适时地调整其传输速率,因此其上的应用都尽可能抢占带宽,甚至压制TCP流量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值