Socket 通信编程与传输协议分析

 

实验目的与要求

1. 掌握 Socket 通信协议实现的方法,能够使用至少一种语言编写通信程序;

2. 理解 TCP 与 UDP 通信实现的方法和过程,理解报文段封装的作用,掌握可靠传输实现的方法;

3. 理解 TCP 三次握手建立连接、数据传输、四次挥手拆除连接的方法和过程。

实验原理

  1. Socket Socket 本质是编程接口(API),对 TCP/IP 的封装,TCP/IP 为网络服务和应用提供 Socket 编程接口,当前主要的 Socket 编程主要有 SOCK_STREAM (TCP)、SOCK_DGRAM (UDP) 工作在传输层,SOCK_RAW 工作在网络层,如图 1 所示。

9413752db2604bfbb05c65ad57d3b074.png

  1. TCP 报文段封装及通信过程 TCP 在 IP 层提供的不可靠服务基础上实现可靠数据传输服务,流水线机制传输,使用 累积确认号确认传输,并使用单一重传定时器和收到重复 ACK 确认传输失败,进行重传。 TCP 报文段结构如图 2 所示。

42316b82d0c1460192bf61cedcbbfb05.png

源地址端口、目的端口,16 位字段,发送接收该报文段的主机中应用程序的端口号。 序号(segment 第一个字节的编号)、确认号(接收方期望从对方接受的字节)。 RST:连接复位;SYN:建立连接,让连接双方同步序列号;FIN:释放连接。 窗口大小: TCP 的窗口大小,以字节为单位。最大长度是 65535 字节(16 位)。 检验和:将传输层伪首部与首部字段及数据求和并校验,保证数据的完整性和准确性。

实验设备与软件环境

1. 安装有 Wireshark 的客户端;

2. 安装并配置有 C|C++|JAVA|PYTHON 运行环境的服务器及客户端;

3. 相对稳定的局域网环境(有线或者无线)

实验过程与结果

  1. 端口扫描编程及验证

端口扫描是基于 Socket 函数的应用,一般通过 Socket connect 连接服务器端口,建立成 功,就说明对方开放了该端口,对于了解服务器开启了那些网络服务比较有用。

目前主要的扫描有 TCP connect()、TCP SYN、TCP FIN 等,这些扫描对于真实的生产环 境的网络安全造成一定的威胁,扫描的测试及验证应自己搭建虚拟服务器进行。编程和测试如图1.1所示。

cced90344de744ad9c1d65df6fb3abc9.jpeg

1.1

  1. #include<WinSock2.h>
  2. #include<iostream>
  3. #define DEST_IP "127.0.0.1" //IP地址
  4. #define DEST_PORT m                        //端口
  5. using namespace std;
  6. int m;
  7. int main() {
  8. WORD mVersionRequested = MAKEWORD(2,2);
  9. WSADATA wsaData;
  10. if(WSAStartup(mVersionRequested,&wsaData) != 0){
  11.            cout<<"初始化 WinSock 失败!"<<endl;
  12.            return 0;
  13. }
  14. int start,stop;
  15. cout<<"请输入目的主机的扫描起始端口:";
  16. cin>>start;
  17. cout<<"请输入目的主机的扫描结束端口:";
  18. cin>>stop;
  19. for(m=start;m<=stop;m++){
  20.            int sockfd,n;
  21.            struct sockaddr_in dest_addr;
  22.            sockfd = socket(AF_INET, SOCK_STREAM, 0);
  23.            dest_addr.sin_family = AF_INET;
  24.            dest_addr.sin_port = htons(DEST_PORT);
  25.            dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
  26.            cout<<"正在扫描端口:"<<m<<endl;
  27.            n = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
  28.            if(n==-1){
  29.                     cout<<m<<"端口没有开启"<<endl;
  30.            }
  31.            else{
  32.                     cout<<m<<"端口开启"<<endl;
  33.            }
  34. }
  35. return 0;
  36. }
  37. Socket 通信编程

当前主要的Socket 编程主要有 SOCK_STREAM (TCP)、SOCK_DGRAM (UDP),SOCK_RAW,要求完成基于 TCP 的 Socket 通信,包括 server 和 client 部分,用 C、C++、JAVA 和 Python 实现都可以,必须有连接建立,数据传输及连接拆除过程。代码如下图所示:

  1.    客户端:Socket 通信测试

  1. 服务器:Socket 通信测试

  1. 传输层协议及通信过程分析

为了验证及分析传输层协议及通信过程,应在服务器和客户端之间至少发送一条数据 (建议包含学号和姓名),并且由退出及关闭连接,在 SocketServer 或者 SocketClient 所在的 网卡进行报文捕捉,报文内容应包含三次握手建立连接过程、数据发送及确认,四次挥手拆 除连接过程。

过程如下图所示:

129b07dc21cf457ca2db008f69cd0ba1.jpeg

分析这三个过程,并计算 Sequence Number。分析过程及序列号计算示例如下图所示。

c4a48db7d19440b58e15cf05192c7d8c.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴某428

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值