zoukankan      html  css  js  c++  java
  • TCP

     自己的理解,看个乐就行

    TCP如何保证可靠性

    给每一个字节编号:

    TCP给每一个发送的字节进行编号,接收端使用确认号对已收到的字节进行确认,这样可以保证接收端收到数据的有序性,不重复。

    使用检验和保证接收的数据的正确性

    发送端发送完一个字节后会启动计时器,若超时还未收到接收端的确认报文段会进行超时重传

    流量控制

    TCP使用滑动窗口协议来进行流量控制,发送端一次性能发送的数据大小取决于发送窗口,接收端一次性能接受数据的大小取决于接收窗口和拥塞窗口,接收窗口值的大小取决于接收端处理数据的速度,发送窗口的大小不大于接收窗口

    拥塞控制

    拥塞窗口的大小能体现目前的网络环境,受网络环境的影响,发送窗口的大小还取决于拥塞窗口,计算拥塞窗口的大小有两种策略,第一种:慢开始和加法增大,第二种:乘法减小。

    刚开始是TCP把拥塞窗口值设为最大报文段长度,接收到第一个确认报文段就把拥塞窗口值设为2,接收到第二个确认报文段就把拥塞窗口值设为4,第三次设为8,指数级增长,直到达到一个门限值,然后进行加法增大,收到一个被确认的报文段就将拥塞窗口+1,直到发生了拥塞(在重传计时器截止时期之前没有收到确认报文段),当发生拥塞时,将门限值设为发生拥塞时窗口大小的一半,将拥塞窗口设为1,重新进行慢开始,加法增大,乘法减小。

    TCP三次握手

     

    三次握手是为了防止一些无效和错误的连接到达服务端浪费服务端的资源。如果只进行两次握手,客户端只要收到了请求就会进入连接状态,而不会再次确认客户端是否还存在。

    这样就很有可能造成服务端资源的浪费

    四次挥手:

     

     假设连接的释放是由客户端(发送端)发起,此时接收端突然收到来自接受端的请求,可能还会有一些数据没传输完毕,所以客户端先发送FIN释放连接请求报文给服务端(接收端),

    服务端收到后立刻回复ACK应答报文,然后再需要经过CLOSE-WAIT阶段才会发送FIN释放请求报文,再CLOSE-WAIT阶段,服务端将未发送完的数据发送给客户端,发送完毕,再发送FIN释放连接报文,

    发送端收到这个FIN释放连接报文后会发送一个ACK响应报文,然后进入TIME-WAIT阶段,等待2msl,这个时间是报文在客户端和服务端传输一个来回的时间,等待这2sml时间是为了确保服务端ACK报文,若没收到,服务端会再次发送FIN释放请求报文,

    客户端也会再次接收到FIN报文,并且重发ACK响应报文,并且重置计时器,再次等待2msl。

    为什么要四次挥手?

    因为服务端的ACK响应报文和FIN释放请求报文是分开为两次传输的,分别在第二次和第三次,同时进行四次挥手的目的是保证双方都能关闭连接,如果只有三次挥手,客户端很有可能没收到FIN连接而苦苦等待已经关闭的客户端的FIN释放报文。

  • 相关阅读:
    WebStorm 使用过程中出现的一些问题以及解决方案
    常用软件工具收集
    个人博客运营策略总结
    OpenGL glMatrixMode() 函数解释与例子
    让搭建在 Github Pages 上的 Hexo 博客可以被 Google 搜索到
    使用 statcounter 统计 Hexo 博客访问量
    使用 Hexo,Material Theme 以及 Github Pages 搭建个人博客
    Ubuntu 16.04下配置 Nginx 与 Node.js 以及服务的部署
    一个简单的在线代码编辑器的实现
    在已有 Windows10 系统的基础上,安装 Ubuntu17.10 系统(新版 BIOS)
  • 原文地址:https://www.cnblogs.com/yu-xia-zheng-ye/p/13483404.html
Copyright © 2011-2022 走看看