zoukankan      html  css  js  c++  java
  • TCP

    TCP在客户端和服务端建立一个连接,并且可以提供可靠性。当TCP向另一端发送数据时,它要求对方返回一个确认。如果没有收到确认,TCP会自动重发数据并等待更长时间。

    在数次重传失败以后,TCP才确认放弃,重传数据花费的时间通常在4~10分钟。但是TCP并不能保证数据一定会被对方接收。因此TCP并不是百分百可靠的传输协议,它只是提供了可靠的的数据传输和可靠的错误通知。

    TCP内部会有算法动态估计TTT(round-trip time)动态往返时间,所以它知道等待确认有多长时间,另外,由于RTT会在网络传输时受到不同因素影响,所以TCP会持续估计RTT。

    TCP通过对传输的每个字节关联一个序列号来对数据进行排序。即即使传到另一端的数据是无序的,TCP也会在将数据进入接收应用之前根据序列号对其进行排序。如果TCP接收到的是重复数据,它也可以判定是重复

    数据而将它丢弃。

    TCP提供流量控制,TCP总是在任意时刻确切告诉其对端它愿意从对端接受多少字节的数据。这称之为advertised windwo。窗口是接受缓冲区中当前可用的空间量,保证发送方不会溢出接收缓冲区。这个窗口是动态改变的,当从发送方接受数据后,窗口大小会减小,当接收应用程序聪buffer里读取数据后,窗口大小会增加。窗口的大小有可能会0.这时它必须要等接收应用读取数据后,才能从对端接收数据。

    TCP是full-duplex全双工的,这意味着应用程序可以随时在给定连接上双向发送和接收数据。这意味着TCP必须要追踪每个方向的数据流的状态信息:比如序列号和窗口大小。当全双工建立以后,如果愿意它可以变成单向传输的。


     二、TCP输出:

      

      application Writes data to a TCP socket.

    • 当application 调用write,kernel 从application buffer 复制所有data到socket send buffer,每个TCP socket 都有一个send buffer,通过SO_SNDBUF改变其size。
    • 如果send buffer的room容不下 application data或者application buffer 大于socket send buffer或者socket send buffer中已经有数据,那么此时process(进程)将被put to sleep。挂起(睡眠),这里假设套接口是阻塞的。在application的所有data 从application buffer 全部拷贝到socket send buffer之前,内核不会从write系统调用返回。因此从一个TCP socket的write成功返回只意味着我们可以重新使用application buffer,并不意味着对方的TCP或application已经接收到数据。
    • TCP取socket send buffer的数据并把它发送给对端TCP,其过程基于TCP数据传输的所有规则。对端TCP必须确认收到的数据,只有收到对端的ACK,本端TCP才能删除socket send buffer中已经确认的数据,TCP必须data 的copy直到收到对端的ACK。
    • TCP以MSS-sized 或者更小的chunks将数据发送给IP,在每个数据段前面加上TCP header,MSS的value是对方告知的,如果对方没有发送一个 MSS,默认是536.
    • IP给每个TCP分节加上IP Header构成IP数据报,查找其宿IP地址的路由表项以确定外出接口,然后把数据报传递给相应的数据链路。
    陈小洁的三只猫
  • 相关阅读:
    Python randrange() 函数
    200行Python代码实现2048
    select默认下拉箭头改变、option样式清除
    图片垂直居中
    去除select边框和三角-----appearance:none
    原生 js 实现点击按钮复制文本
    This dependency was not found: * !!vue-style-loader!css-loader?……解决方案
    vue项目启动时将localhost替换成指定ip地址
    安装cnpm
    vue 项目要使用的库
  • 原文地址:https://www.cnblogs.com/ccpang/p/11329292.html
Copyright © 2011-2022 走看看