zoukankan      html  css  js  c++  java
  • TCP两种黏包现象及其成因

    第一种

     1 import socket
     2 
     3 sk = socket.socket()
     4 sk.bind(("127.0.0.1", 8080))
     5 sk.listen()
     6 conn, addr = sk.accept()
     7 ret1 = conn.recv(2)
     8 ret2 = conn.recv(8)
     9 print(ret1)
    10 print(ret2)
    11 conn.close()
    12 sk.close()
    server1
    1 import socket
    2 
    3 sk = socket.socket()
    4 sk.connect(("127.0.0.1", 8080))
    5 sk.send(b"hello")
    6 sk.send(b"world")
    7 sk.close()
    client1
    1 b'he'
    2 b'lloworld'
    结果

    原因

    当一个数据发送超过接收的大小时,剩余的数据会进入系统的缓冲区内,下一次再接收时会把上一次没传完的数据继续接收这也就造成了第二次发送的数据和第一次发送的数据混在一起的现象
    这种现象被称作黏包

    第二种

     1 import socket
     2 
     3 sk = socket.socket()
     4 sk.bind(("127.0.0.1", 8080))
     5 sk.listen()
     6 conn, addr = sk.accept()
     7 ret1 = conn.recv(12)
     8 print(ret1)
     9 conn.close()
    10 sk.close()
    server2
    1 import socket
    2 
    3 sk = socket.socket()
    4 sk.connect(("127.0.0.1", 8080))
    5 sk.send(b"hello")
    6 sk.send(b"world")
    7 sk.close()
    client2
    1 b'helloworld'
    结果

    原因

    这种现象的原因是TCP协议本身的优化算法造成的
    优化算法的功能是:连续两次send如果时间间隔小且两个数据包的大小都很小,则把这两个数据包合并成一个数据包来发送

  • 相关阅读:
    频率计数器简介
    电力时钟厂家简介
    linux mail命令详解
    /etc/postfix下 main.cf 配置文件详解
    linux tar
    Linux find命令详解
    Python with
    Python 多进程概述
    python paramiko模块简介
    python 全局变量和局部变量
  • 原文地址:https://www.cnblogs.com/changjiangwei/p/11378329.html
Copyright © 2011-2022 走看看