TCP实验报告.docx
《TCP实验报告.docx》由会员分享,可在线阅读,更多相关《TCP实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
![TCP实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/6/e5adc622-9c4c-4a8a-bff5-7998910afa6d/e5adc622-9c4c-4a8a-bff5-7998910afa6d1.gif)
TCP实验报告
TCP/IP协议分析
与应用编程
实
验
报
告
专业:
计算机科学与技术
班级:
2012级4班
姓名:
彭晓
学号:
21209010434
实验一Wireshark协议分析
一、实验任务:
软件环境:
Windows2000或者WindowsXP,Wireshark
基本要求:
(1)在Windows上,安装Wireshark。
利用Wireshark抓取数据包。
(2)分析Ethernet,ARP,IP,ICMP,TCP,UDP,HTTP等协议。
实验报告要求:
分别在数据链路层ARP、网络层IP,ICMP、传输层TCP,UDP和应用层HTTP中选取一个协议的数据包,分析数据包中报文的具体含义。
二、实验内容:
一、ARP数据报
目标MAC地址:
08101704128f
源MAC地址:
402cf40c92a5
协议类型(ARP):
0806
硬件类型(以太):
0001
协议类型(IP):
0800
硬件长度(6字节):
06
协议长度(4字节):
04
操作(应答):
0001
信源MAC:
402cf40c92a5
信源IP(192.168.1.1):
c0a80167
信宿MAC:
08101704128f
信宿IP(192.168.1.103):
c0a80101
二、IP数据报
目标地址:
002389b817ab
源MAC地址:
00e04c001677
协议类型(IP):
0800
版本号(4),首部长度20(4*5),服务类型(0):
4500
总长度(40):
0028
标识(3280):
0cd0
未分片,片偏移量(0):
4000
TTL(40):
40
上层协议TCP(6):
06
首部校验和:
7921
源IP地址(192.168.0.62):
c0a8003e
目的IP地址(180.97.63.151):
b4613f97
上层协议TCP数据报:
05850050bcd035f00000000150140000025b0000
三、TCP数据报
1)第一次握手数据帧
第一次握手:
源端口(1415):
0587
目的端口(80):
0050
序列号:
e2fac8b0
确认号:
00000000
首部长度:
80
标志(SYN):
02
窗口大小(65535):
ffff
校验和:
08aa
紧急指针:
0000
最大报文段长度选项:
020405b4
无操作选项:
01
窗口扩大因子选项:
030303
无操作选项:
01
无操作选项:
01
SACK选项:
0402
2)第二次握手数据帧
第二次握手:
源端口(80):
0050
目的端口(1415):
0587
序列号:
00000000
确认号:
e2fac8b0
首部长度:
60
标志(SYN,ACK):
12
窗口大小(32768):
8000
校验和:
b1dd
紧急指针:
0000
最大报文段长度选项:
02040580
尾部填充0凑整:
0000
3)第三次握手数据帧
第三次握手:
源端口(1415):
0587
目的端口(80):
0050
序列号:
e2fac8b1
确认号:
00000001
首部长度:
50
标志(ACK):
10
窗口大小(65535):
ffff
校验和:
4967
紧急指针:
0000
四、HTTP数据报
HTTP是应用层协议。
HTTP请求报文分析
HTTP响应报文分析
HTTP链路层
HTTP链路层:
源地址:
402cf40c92a5
目的地址:
08101704128f
类型(IP):
0x0800
HTTP网际层
HTTP网际层:
版本号(4),首部长度20(4*5),服务类型(0):
4500
总长度(650):
028a
标识(23018):
59ea
标志:
40
片偏移(0):
00
TTL(64):
40
协议(TCP):
06
校验和:
cbbb
信源IP(192.168.1.103):
c0a80167
信宿IP(119.75.217.109):
774bd96d
-
HTTP传输层
HTTP传输层:
传输层源端口(2592):
0a20
目的端口(80):
0050
序列号:
514e8661
确认号:
6e2a10ed
首部长度(20字节):
50
标志(PSH,ACK):
5018
窗口大小(64768):
fd00
校验和:
5968
HTTP应用层
HTTP应用层:
请求行:
GET/HTTP/1.1\r\n
3、实验小结:
通过对Wireshark抓包软件的分析和了解,学会利用wireshark捕获数据包。
并对各层网络协议(HTTP协议、ARP协议、ICMP协议、IP协议)等和EthernetII层数据帧上的数据包信息进行分析对应的格式和查看一个抓到的包的内容,知道了数据帧上信息的涵义。
实验二简单套接字编程
一、实验任务:
软件环境:
Windows2000或者WindowsXP,VS2005
基本要求:
(1)在VS2005上,编写、编译Win32Console套接字程序。
要求客户机端程序能发送消息给服务器端程序。
实验报告要求:
完成一个TCP或UDP程序,实验报告应包含主要代码及程序运行结果。
2、实验内容:
服务器端:
#include
#include
usingnamespacestd;
#include
intmain(intargc,char*argv[])
{
constintDEFAULT_PORT=5000;
WORDwVersionRequested;
WSADATAwsaData;
interr,iLen;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0)
{
cout<<"加载WinSock失败!
";
return0;
}
//创建用于监听的套接字
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//创建服务器监听套接字
if(sockSrv==INVALID_SOCKET)
{
cout<<"socket()fail:
"<return0;
}
SOCKADDR_INaddrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//自动分配地址,字节顺序转换
addrSrv.sin_port=htons(DEFAULT_PORT);//字节顺序转换
//绑定本地主机IP和端口
err=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(err!
=0)
{
cout<<"bind()fail:
"<return0;
}
//监听
err=listen(sockSrv,5);
if(err!
=0)
{
cout<<"listen()fail:
"<return0;
}
cout<<"Serverwaiting...:
"<SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
while
(1)
{
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接收客户进程连接请求
if(sockConn==INVALID_SOCKET)
{
cout<<"accept()fail:
"<break;
}
charsendBuf[1024],hostname[100];
if(gethostname(hostname,100)!
=0)//获取主机名称
strcpy(hostname,"None");
sprintf(sendBuf,"welcome%sconnectedto%s!
",inet_ntoa(addrClient.sin_addr),hostname);
err=send(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送数据
if(err==SOCKET_ERROR)
{
cout<<"send()fail:
"<break;
}
charrecvBuf[1024]="\0";
iLen=recv(sockConn,recvBuf,1024,0);//接收数据
if(iLen==SOCKET_ERROR)
{
cout<<"recv()fail:
"<break;
}
recvBuf[iLen]='\0';
cout<closesocket(sockConn);//关闭套接字
}
closesocket(sockSrv);//关闭服务器监听套接字
WSACleanup();
return0;
}
客户端:
#include
#include
usingnamespacestd;
#include
intmain(intargc,char*argv[])
{
constintDEFAULT_PORT=5000;
WORDwVersionRequested;
WSADATAwsaData;
interr,iLen;
if(argc<2){
cout<<"Command:
TcpEx_ClientServerIP"<return0;
}
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0)
{
cout<<"加载WinSock失败!
";
return0;
}
//创建用于连接的套接字
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);
if(sockClient==INVALID_SOCKET)
{
cout<<"socket()fail:
"<return0;
}
SOCKADDR_INaddrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_addr.S_un.S_addr=inet_addr(argv[1]);
addrSrv.sin_port=htons(DEFAULT_PORT);
err=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//请求连接服务器进程
if(err==INVALID_SOCKET)
{
cout<<"connect()fail:
"<return0;
}
charsendBuf[1024],hostname[100];
if(gethostname(hostname,100)!
=0)//获取主机名称
strcpy(hostname,"None");
strcpy(sendBuf,hostname);
strcat(sendBuf,"haveconnetedtoyou!
");
err=send(sockClient,sendBuf,strlen(sendBuf)+1,0);//发送数据
if(err==SOCKET_ERROR)
{
cout<<"send()fail:
"<return0;
}
charrecvBuf[1024];
iLen=recv(sockClient,recvBuf,1024,0);//接收数据
if(iLen==0)
return0;
elseif(iLen==SOCKET_ERROR)
{
cout<<"recv()fail:
"<return0;
}
else
{
recvBuf[iLen]='\0';
cout<}
closesocket(sockClient);//关闭套接字
WSACleanup();
}
三、实验小结:
通过这次的实验理解了socket基本知识及原理,同时实现了基于Socket的客户端与服务器端的连接,自己动手可以真正学到知识,而且同学热心解答问题也让我更体会到交流的重要。