zoukankan      html  css  js  c++  java
  • 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状态,完成三次握手。

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

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

  • 相关阅读:
    linux之使用samba实现文件共享
    高级C/C++编译技术之读书笔记(三)之动态库设计
    Java之序列流SequenceInputStream
    Java文件清单列表
    Java之Property-统获取一个应用程序运行的次数
    Java持久化存储对象Properties的方法list、store、load
    Java深度遍历文件夹(递归实现)
    Java流操作之转换流
    Java之字节输入流和输出流
    Java自定义缓冲区MyBufferedReader
  • 原文地址:https://www.cnblogs.com/u3ddjw/p/8268366.html
Copyright © 2011-2022 走看看