C# TCP 了解

参考:http://www.jb51.net/article/118682.htm

一: TCP 

  粘包原理:发送方发送若干数据给接收方时粘成一包。从接收缓冲区看,后一包的头紧接前一包的数据的尾。

      发送方引起:TCP协议本身造成,TCP为提高传输效率,将连续发送几次的数据包小的紧凑的,合并为一个包。(Nagle优化算法)

      接收方引起:接收方进程不及时接收数据,从而导致粘包现象。因为接收方先把收到的数据放到系统缓冲区,进程从该缓冲区取数据,若下一包到达时前一包数据尚未被用户进程取走。这样一次取多包数据。

  解决方案:修改Socket配置

        Nodelay,不采用优化算法,发送端解决粘包。

        缺点:降低网络传输效率。

        使用代码解决:

         一个完整的数据包  = 包头 +包体长度。(数值压缩存储方法,减少包头字节数,一般为2位字节即可)

        设置缓冲区,判断不等于包头的字节存储在缓冲区,等待下一数据包,连接起来。

       

  三次握手原理:

      第一次握手:客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认。

·      第二次握手:服务器收到syn包,必须确认客户的SYN(ack = j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK

,此时,服务器进入SYN_RECV状态。

      第三次握手:客户端收到服务器端SYN+ACK包,向服务器发送确认包ACK(ack = k+1),此包发送完毕,客户端与服务器进入ESTABLISHED状态,完成三次握手。

  注:握手过程中传送的包中不包含数据,三次握手完毕后,客户端才向服务器端正式发送数据。

优势:保证顺序,保证稳定。

原文地址:https://www.cnblogs.com/u3ddjw/p/8268366.html