TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,与之相反的,采用四次挥手来断开连接:
    TCP标志位有6种标示,即:SYN(建立联机) 、 ACK(确认) 、 PSH(传送) 、 FIN(f结束) 、 RST(重置) 、 URG(紧急) 、 Sequence number(顺序号码) 、 Acknowledge number(确认号码)。
    TCP为什么需要三次握手、四次挥手
    1. 三次握手的最主要目的是保证连接是双工的, 可靠更多的通过重传机制的来保证的。
    双工: 我的发送和请求是可以同时执行的,并且连接的双方都可以相互发送和接收
    2. 因为连接是全双工的,双方必须收到对方的FIN包及确认才可关闭

    image.png

    首先是客户端连接服务端的一个流向。首先是客户端发送同步(SYN)包,去请求连接,服务端响应(SYN)包并加(ACK)包,表示你可以连接。
    客户端相应的收到ACK包,建立这个链接。这样三次握手就完毕了。

    image.png

    主动连接方发送FIN包,请求关闭,被动接收方回复ACK包,表示已经收到请求,并且被动发送方完成关闭操作中间有个间隙,完成关闭以后在回复一个FIN包,表示可以关闭了,那主动关闭方在回复一个ACK包,表示确认关闭。至此,双方就完成了一个Finsh状态、Close状态。

    为什么time_wait需要等待2MSL?
    MSL: Maximum Segmnet Lifetime,30秒—1分钟
    1. 保证TCP协议的全双工连接能够可靠关闭
    2. 保证这次链接的重复数据段从网络中消失

    为什么出现大量time_wait?
    1. 首先close_wait一般出现在被动关闭方
    2. 并发请求太多的导致
    3. 被动关闭方为及时释放端口资源导致的

    TCP为什么需要流量控制?
    1. 由于通讯双方,网速不同。通讯方任一方发送过快都会导致对方消息处理不过来,
    所以需要把数据放到缓冲区中
    2. 如果缓冲区满了,发送方还在疯狂的发送数据,那么接收方只能把数据包丢弃。
    因此,我们需要控制发送速率。
    3. 我们缓冲区剩余大小称之为接收窗口,用变量win表示。如果win=0,则发送方停止发送。

    image.png

    TCP为什么需要拥塞控制
    1. 流量控制与拥塞控制是两个概念,拥塞控制是调节网络的负载。
    2. 接收方网络资源繁忙,因未及时响应ACK导致发送发重传大量数据,
    这样将会导致网络更加拥堵。
    3. 拥塞控制是动态调整win大小,不只是依赖缓冲区大小确定窗口大小。

    TCP拥塞控制
    1. 慢开始和拥塞避免
    image.png

    image.png

    1. 快速重传和快速回复
      image.png

    为什么会出现粘包、拆包?
    image.png
    1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
    2. 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到
    网络上,这将会发生粘包。
    3. 进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候,将发生拆包。
    4. 接收方法不及时读取套接字缓冲区数据,这将发生粘包。

    如何获取完整的应用数据报文?
    1. 使用带消息头的协议,头部写入包长度,然后读取包内容。
    2. 设定定长消息,每次读取定长内容,长度不够时空位补固定字符。
    3. 设置消息边界,服务端从网络流中按消息边界分离出消息内容,一般使用’/n’
    4. 更为复杂的协议,例如json、protobuf