TCP协议与UDP协议 TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 即面向流的通信是无消息保护边界的. UDP(user datagram protoc…
1.先说下subprocess模块的用法,为了举个黏包的例子 # 通过一个例子 来认识网络编程中的一个重要的概念 # 所有的客户端执行server端下发的指令,执行完毕后,客户端将执行结果给返回给服务端 import subprocess # 这个模块其实并不好用,这里为了举例子.调用操作系统的命令模块 res = subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 执行dir…
1. 黏包 1.1 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 1.1.1 基于TCP协议实现的黏包 server: #_*_coding:utf-8_*_ from socket import * import subprocess ip_port=('127.0.0.1',8888) BUFSIZE=1024…
tcp传输黏包 tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带宽,底层会使用缓存技术,具体的说就是使用Nagle算法将小的数据包放到一起发送,但是这样也带来一个使用上的问题--黏包,黏包就是说一次将多个数据包发送出去,导致接收方不能进行正常的解析,示意图如下: 发生黏包一般有两种原因,一种是发送方进行了不该缓冲的缓冲,比如上图中,收发双方协议好按照一定的规则进行编写/解…
参考:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 1.黏包的表现(以客户端远程操作服务端命令为例) 注:只有在TCP协议通信的情况下,才会产生黏包问题 基于TCP协议实现的黏包 #!/usr/bin/env python # -*- coding: utf-8 -*- # tcp_server_cmd.py import socket import subprocess ip_port = ('127.0.0.1', 80…
老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html server端 import socket import subprocess server=socket.socket(type=socket.SOCK_DGRAM) ip_port=('192.168.43.155',8895) server.bind(ip_port) while 1: message,address=server.recvfrom(1024) if messa…
黏包的解决方案 远程执行命令 # server 下发命令 给client import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr = sk.accept() while True: cmd = input('>>>') if cmd == 'q': conn.send(b'q') break conn.send(cmd.encode('gbk')) res = conn.re…
一.缓冲区 二.两种黏包现象 两种黏包现象: 1 连续的小包可能会被优化算法给组合到一起进行发送 黏包现象1客户端 import socket BUFSIZE = 1024 ip_prort = ('127.0.0.1',8001) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) res = s.connect(ip_prort) s.send('hi'.encode('utf-8')) s.send('meinv'.encode('ut…
问题:之前我们系统上线后,因为是旧的系统,没有加统计的功能,比如用户喜欢那个页面,是哪些用户再访问,接口的负载能力等等. 解决办法:1,现有代码更改,添加功能.现有代码侵入太多,工作量比较大 2,想到tcpdump 抓包,然后分析文件.文件特别大,而且不能做到实时处理. 3,采用python 脚本来处理,直接抓包80端口,加上一些处理,入库之内. 环境搭建: 1,使用到的第三方包:dpkt-1.8.8.tar.gz, impacket-master.zip, pcapy-master.zip p…
一.基于TCP的socket tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端,有顺序,不重复,可靠.不会被加上数据边界. server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客…