TCP/IP协议分析实验指导书
TCP/IP协议是Internet的主要通信协议,其对于Internet中各网络节点的数据通信起着至关重要的作用。相对于《计算机网络》课程中讲授的各种网络协议而言,TCP/IP 协议族只是其中涉及的一个特例,但是就实际应用而言,了解和把握TCP/IP的协议工作原理对网络理论知识是一个很好的实践方法。而要了解TCP/IP协议族的工作原理,利用socket接口编程是一个绝好,并有效的方式。
tcpip协议中基于tcp协议的应用程序TCP/IP协议起源于UNIX系统,并得到了现在大部分主流操作系统的支持。因此,最好的TCP/IP协议学习环境应是类UNIX操作系统下,而LINUX起源于UNIX,并且大部分功能和使用方式都与UNIX及其类似,更重要的是其开放源码,可免费使用。基于此,本课程的实践环境选择使用LINUX操作系统。
【实验环境】
主机操作系统:windows xp
虚拟机管理软件:VMWare workstation7.1
虚拟机操作系统:UBUNTU11.04
虚拟机操作系统之C/C++编程环境:code::blocks10.05
实验1TCP套接字编程---echo客户与服务器
【实验目的】
掌握TCP套接字编程的客户程序与服务器程序的基本编写步骤,熟悉各种基本的套接字函数的使用。理解套接字在客户程序与服务器程序间的作用及其工作原理。
【实验知识】
从计算机系统的概念上讲,套接字是一个文件,该文件记录了本地的地址信息以及其连接的远程套接字的地址信息,这些信息并不由客户程序或服务器程序本身所使用,而是提供给TCP和IP协议栈使用。换句话说,就是我们编写的套接字程序本身仅提供相关必要的信息构造好套接字后,接下来的事情就是在我们所编写的套接字程序中通过调用相应套接字API函数通知操作系统内核我们要做什么,然后由操作系统内核去完成的。
套接字中,系统负责维护发送缓冲和接收缓冲,这些缓冲所在的权限范围属于操作系统内核,只要操作系统内核中的代码才能读取其内部的信息。(其实,套接字本身就是操作系统内核维护的资源,用户程序代码是无法直接访问的)这两个缓冲主要是提供给TCP/IP协
议来接收和发送数据用的。
例如:当客户程序要向远程服务器程序发送数据时,客户程序中有一个保存所需发送数据的本地缓冲,当调用send函数后(注意:可以发送数据的前提是,本地套接字已经与远程服务器的连接套接字建立好连接),send函数就将本地缓冲中的数据传送给操作系统内核中的对应套接字中的发送缓冲里面,而给发送缓冲中的数据何时发送给服务器程序,这并不能够确定,总归这不是由客户程序所决定的,客户程序只负责将要发送的数据送给本地操作系统内核中的套接字的发送缓冲中;
远程服务器程序,在接受了客户程序的连接请求,并与之建立好套接字连接后,就调用recv函数接收客户程序所发来的数据。必须明确的是,服务器端使用已连接套接字与客户程序端套接字建立了TCP的连接,而非监听套接字。recv函数从已连接套接字中的接收缓冲中获取数据,并将获得的数据写入到recv函数的第二个参数指向的本地缓冲区中,然后服务器程序就可以通过recv第二个参数来访问接收到的数据(可以打印出数据内容,或者原封不动的发回给客户程序等等)。
掌握基本的套接字编程,需要理解以下几个关键点:
1.套接字函数是提供给用户编写程序时调用系统内核功能的用户接口,用户只需在编
写代码时决定何时调用,如何调用,以及怎么处理返回结果等;而套接字函数本身
做了些什么,这是操作系统实现者已经设定好了的,我们无需去管,也无法去管。
2.套接字程序需要发送的数据并不是由程序自己直接发送给远端程序,而是传递给本
地操作系统(通常,将保存数据的缓冲区首地址作为参数,传递给操作系统),由
操作系统的协议实现完成数据的网络传输工作;
3.基本的TCP套接字客户程序与服务器程序的编写步骤,每一步所涉及的套接字函数
及数据结构需要很好的掌握,并且要能够理解每一个函数具体完成了什么工作。
TCP套接字客户程序与服务器程序的主要工作流程图:
主要函数及数据结构:
#include<sys/socket.h>
int socket(int family,int type,int protocol)
返回:非负描述字──成功,-1──出错
#include<netinet/in.h>
struct in_addr{
in_addr_t s_addr;
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
#include<sys/socket.h>
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
#include<sys/socket.h>
int connect(int sockfd,const struct sockaddr*server_addr,socklen_t addrlen)
返回:0──成功,-1──失败。
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*addr,socklen_t addrlen)
返回:0──成功,-1──失败
#include<sys/socket.h>
int listen(int sockfd,int backlog)
返回:0──成功,-1──失败
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr*addr,socklen_t*len)
返回:非负描述字——成功,-1——失败
#include<unistd.h>
int close(int fd)
返回:0——成功,-1——失败
#include<netinet/in.h>
#include<arpa/inet.h>
const char*inet_ntop(int af,const void*src,char*dst,socklen_t size);
int inet_pton(int af,const char*src,void*dst);
in_addr_t inet_addr(const char*cp);
#include<sys/socket.h>
int getsockname(int s,struct sockaddr*name,socklen_t*namelen);
int getpeername(int s,struct sockaddr*name,socklen_t*namelen);
【实验内容】
编写一个TCP套接字客户程序,该程序能够完成向echo服务器程序发送一个字符串,并可以从echo服务器程序那里获取返回的字符串,并打印到屏幕;
编写一个TCP套接字echo服务器程序,该程序运行后,一直等待客户程序的连接请求,在接受客户程序的连接后,打印出客户程序的连接套接字的IP地址及端口号。然后,接收客户程序发来的字符串数据,并将该字符串数据发回给客户程序。
【实验要求】
本实验要求的实验内容,必须在实验课前自主完成,在每次对应实验课开始之前相应的实验项目内容必须已经基本完成,实验课上主要对实验过程中的问题进行解答和讨论。
实验报告采用学校印制的《实验报告》本的方式提交,实验报告内容需要手写,涉及到代码部分或截图请将相关代码打印后贴于实验报告中。
注意:
1、打印时,以整齐看的清为准则调整字体和图片大小,不要过大;
2、不要随意乱贴,要按照打印内容贴至对应实验报告对应文字处。
(后面所有实验都按此【实验要求】为准,在之后的实验说明中不再赘述)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论