计算机网络原理实验 python socket 编程

网络原理课程

Python socket编程实验

一、实验内容

1.编写一个基于UDP协议的客户机与服务器程序,实现相互通讯。

2.编写一个基于TCP协议的客户机与服务器程序,实现相互通讯。

3.捕获以上两种通讯的数据包,使用Wireshark进行分析,以深入了解TCP、UDP协议的数据传输机制。

二、实验基础知识

1TCP编程

(1)、建立一个TCP服务器连接需要6个步骤:

1)创建socket对象。调用socket构造函数:

socket=socket.socket(familly,type)

family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字)、SOCK_RAW(raw套接字),TCP使用SOCK_STREAM参数。

2)将socket绑定(指派)到指定地址上,socket.bind(address)

address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。

3)绑定后,必须准备好套接字,以便接受连接请求。

socket.listen(backlog)

backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。

4)服务器套接字通过socket的accept方法等待客户请求一个连接:

connection,address=socket.accept()

调用accept方法时,socket会进入'waiting'(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。

5)处理阶段,服务器和客户通过send和recv方法通信(传输数据)。

服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入'blocket'状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。

6)传输结束,服务器调用socket的close方法以关闭连接。

(2)、建立一个TCP客户端连接则需要4个步骤:

1)创建一个socket以连接服务器 client=socket.socket(family,type)

2)使用socket的connect方法连接服务器 .connect((host,port))

3)客户和服务器通过send和recv方法通信。

4)结束后,客户通过调用socket的close方法来关闭连接。

2. UDP编程

由于UDP是无连接的,与TCP的区别在服务器端表现为,无需监听函数listen()对客户端的连接进行监听; 在客户端的表现为客户端的socket无需与服务器建立连接就能够进行数据的发送与接收,即无需connect()函数。

(1)、建立一个UDP服务器连接需要4个步骤:

1)创建socket对象。调用socket构造函数:

socket=socket.socket(familly,type)

family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字),UDP 使用SOCK_DGRAM参数。

2)将socket绑定(指派)到指定地址上,socket.bind(address)

address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。

3)处理阶段,服务器和客户通过sendto()和recvfrom()方法通信(传输数据)。

4)传输结束,服务器调用socket的close方法以关闭连接。

(2)、建立一个UDP客户端连接则需要4个步骤:

1)创建一个socket以连接服务器 socket=socket.socket(family,type)

2)使用socket的connect方法连接服务器 socket.connect((host,port))

3)客户和服务器通过sendto()和recvfrom()方法通信。

4)结束后,客户通过调用socket的close方法来关闭连接。

3.监听工具简介

最近开发调试过程中需要使用一些抓包工具,Wireshark这个抓包工具比较强大,具体的网上能查到很多,这里只是简单说下一些常用的命令:

ip.addr==需要查的IP地址 and tcp.port==443 : 查询地址和端口号匹配的记录

ip and (tcp.port==4437 or tcp.port==5775) :查询协议和端口号匹配的记录

选中要看的那条记录--右击--Follow TCP Stream 就能看到包里的信息了。如果是明文可以直接看到内容,如果加密了看到的就是乱码。

Wireshark虽然强大,但是无法抓取本地回环数据。也就是说:当你本地测试一个socket程序,发送/接收到本地端口的时候,Wireshark就无能为力了。这个时候需要另外一个工具:RawCap 。

抓好包后,按Ctrl+C,停止抓包。这个时候会在RawCap的同级目录下显示一个dumpfile.pcap文件。通过wireshark打开,就可以看到本地环回的数据包了。

三、实验步骤

在编译器pycharm中运行

1.TCP编程

(1)建立TCP程序

创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。

服务器端程序

计算机网络原理实验 python socket 编程

客户端程序

计算机网络原理实验 python socket 编程
创建套接字,连接,等待输入,发送。

(2)运行RawCap.exe

 

     进入RawCap.exe的文件夹,在目录框输入cmd,点击回车,进入命令窗口输入命令

     RawCap.exe  ip地址  文件名,点击回车

计算机网络原理实验 python socket 编程
 

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程

开始抓取数据包

(3)运行程序

先运行服务器端程序后运行客户端程序

计算机网络原理实验 python socket 编程
服务端运行结果

计算机网络原理实验 python socket 编程
客户端运行结果

(4)查看抓取结果

计算机网络原理实验 python socket 编程
(5)用wireshark打开文件TCPdumpfile.pcap

计算机网络原理实验 python socket 编程

   (6) 查看Tcp流中的应用层数据
在Wireshark的Analyze菜单中选择“Follow TCP Stream”功能,就会出现下面的窗口,窗口显示的就是客户机与服务器通讯的内容,内容出现的顺序同他们在网络中出现的顺序一致。从A到B的通信标记为红色,从B到A的通信标记为蓝色。

计算机网络原理实验 python socket 编程

 

(7)TCP的三次握手

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程


(8)源端口号和目的端口号

计算机网络原理实验 python socket 编程

(9)查看TTL值、IP版本号、协议类型

计算机网络原理实验 python socket 编程
(10)查看IP头长度和传输数据

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程

2. UDP编程

(1)编写程序


UDP编程的服务器端程序

计算机网络原理实验 python socket 编程
UDP编程客户端程序

计算机网络原理实验 python socket 编程

(2)运行RawCap.exe

     进入RawCap.exe的文件夹,在目录框输入cmd,点击回车,进入命令窗口

输入命令RawCap.exe  ip地址  文件名,点击回车

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程

你们写的时候最好文件名写为UDPdumpfile.pcap  我是不小心写错了
(3)先运行服务器程序,然后运行客户机程序,然后进行通讯。

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程

(4)客户机与服务器通讯结束后,回到控制台,看到RawCap已经捕捉到一些数据包。

计算机网络原理实验 python socket 编程

按Ctrl+C,停止抓包。这个时候会在RawCap的同级目录下显示一个DUPdumpfile.pcap文件。
(5)通过wireshark打开,就可以看到本地通讯的数据包了。

计算机网络原理实验 python socket 编程

(6)查看UDP流中的应用层数据

在Wireshark的Analyze菜单中选择“Follow UDP Stream”功能,就会出现下面的窗口,窗口显示的就是客户机与服务器通讯的内容,内容出现的顺序同他们在网络中出现的顺序一致。从A到B的通信标记为红色,从B到A的通信标记为蓝色。

计算机网络原理实验 python socket 编程


(7)查出通讯的源端口、目的端口、TTL值、IP版本号、协议类型、IP头长度以及传输的数。

计算机网络原理实验 python socket 编程

计算机网络原理实验 python socket 编程