TCP连接的建立以及利用tcpdump分析连接建立的过程(转)
原文地址:http://www.cnblogs.com/coser/archive/2010/12/05/1968812.html
一、实验目的
实验1_1:
使用Freebsd/Linux操作系统下的C编译器和网络程序的调试方法,掌握TCP连接建立和终止以及调整缓冲区大小的方法。
实验1_2:
使用ethereal/TCPDump等抓包工具,截取TCP建立过程中产生的数据包,分析连接建立过程。
二、实验环境
操作系统:Ubuntu 10.04 系统
编辑器:vim
网络环境:PC1:Ipv4地址10.3.1.210
PC2:Ipv4地址 10.3.1.211
两台电脑在同一个网段,可以互相通信,能ping通。
代码语言:c语言
代码编译器:gcc编译器
三、实验内容
1. 设计思路
该实验分为两部分:Tcp通信的连接以及利用tcpdump进行抓包,从抓包的内容分析Tcp进行连接的过程。
第一部分:Tcp连接的建立
Server端:
思路:需要定义两个socket,一个用于监听,一个用于接受客户端传来的socket。定义ipv4地址参数,指定Ip地址和端口号。然后进行bind,bind成功后进行对指定socket的监听。当有客户端进行连接请求时,accept函数会接收到来自Client端的socket。然后Server将输出Client端相关信息,例如Ip地址或是端口号等,在向客户端buffer流写入欢迎信息。最后关闭连接。
Client端:
思路:定义一个char字符数组,用于接受服务器端,传来的信息。定义一个socket,然后定义指定服务器端Ipv4地址以及端口号。然后client端主动进行connect连接。连接成功后,接受Server端写入的信息,然后逐一读出,并打印在屏幕上。
第二部分:抓包
利用tcpdump抓包工具,进行抓包,然后查看抓包内容。通过截取TCP建立过程中产生的数据包,分析连接建立过程。
四、相关代码
server:
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXSIZE 1024
int main(int argc , char * * argv )
{
char buffer[MAXSIZE];
int listenfd=socket(AF_INET,SOCK_STREAM,0);//定义socket,指向ipv4地址的字节流套接口 struct sockaddr_in serverAddr;
memset(&serverAddr,0,sizeof(serverAddr));//sockAddr_in 进行初始化
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
serverAddr.sin_port=htons(2000);
if(bind(listenfd,(struct sockaddr *) &serverAddr,sizeof(serverAddr))==-1)
{
printf("There is an error during binding\n");
return -1;
}
else
{
printf("Bind successfully!!!\n");
}
//对listenfd进行监听,从最初建立时的主动套接口(用于进行connect的套接口)转化为被动套接口(接受连接)
listen(listenfd,100);//第二个参数为套接口排队的最大连接个数
int connectfd;
socklen_t addrlen;
struct sockaddr_in connectAddr;
memset(&connectAddr,0,sizeof(connectAddr));
printf("Be ready to accept a connection!\n");
while(1)
{
connectfd=accept(listenfd,(struct sockAddr * )&connectAddr,&addrlen);//接受client端一个请求的socket
char * clientAddress=inet_ntop(AF_INET,&connectAddr.sin_addr,buffer,sizeof(buffer));//获取客户端的ip地址
int clientPort=connectAddr.sin_port;//获取客户端的端口号
//打印出客户端的ip地址以及端口号
printf("Connect from %s , port %d \n",clientAddress,clientPort);
snprintf(buffer,sizeof(buffer),"%s","Welcome to server!\n"); write(connectfd,buffer,sizeof(buffer));
close(connectfd);
}
close(listenfd); //虽然因为上面有while(true),这行永远都执行不了,但是时刻注意关闭socket连接应该是个好习惯。 return 0;
}
client:
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXLINE 4096
int main( int argc , char * * argv )
{
int sockfd , n ;
char recvline[ MAXLINE + 1];
struct sockaddr_in servaddr;
if( ( sockfd = socket( AF_INET , SOCK_STREAM , 0 ) ) < 0 ) {
printf( "socket error\n" );
exit( 1 );
}
memset( &servaddr , 0 , sizeof( servaddr ) );
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons( 2000 );//指定Server端的端口号
char * serverAddress="127.0.0.1";
//判断指定的ip地址是否有错误
if( inet_pton( AF_INET ,serverAddress , &servaddr.sin_addr ) <= 0 ) {
printf( "inet_pton error for %s\n" , serverAddress );
exit( 1 );
}
if( connect( sockfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) ) < 0 ) {
printf( "connect error\n" );
exit( 1 );
}
while( ( n = read( sockfd , recvline , MAXLINE ) ) > 0 ) {
recvline[ n ] = 0;
if( fputs( recvline , stdout ) == EOF ) {
printf( "fputs error\n" );
exit( 1 );
}
}
if( n < 0 ) {
printf( "read error\n" );
exit( 1 );
}
exit( 0 );
}
编译代码:
|
监听抓包代码:
|
读取抓包文件代码: |
sudo tcpdump –r socketlog –A >> log
vi log
操作过程
1.在Server端,启动tcpdump进行抓包。在Client发出一个连接请求,并进行一次实验一的连接。
2.读取获取的包,并将其放入一个log文件中,用以分析。
3.读取log文件。
分析与结论:
从抓包的文件可以看出,此次通信,Server端获取到了所有的package。不仅如此,我们也发现了,通信的内容并没有进行加密,而是明文的传送,因为我们成功获取了Server端发给Client的“Welcome to server”的明文信息。
通过包中的内容,我们不难分析出Tcp通信的连接过程。
1. Client端发送SYN,请求进行连接。
2. Server端回复ACK ,MSS=1460
3. Client端回复ACK,自此TCP连接建立的三次握手完成。
4. Server端发送数据 请求ACK
5. Client端读取数据,应答ACK
6. Server端首先关闭连接,FIN
7. Client端回复ACK
8. Server端 回复ACK 连接自此关闭
TCP连接的建立以及利用tcpdump分析连接建立的过程(转)的更多相关文章
- 利用tcpdump分析工具来验证tcp连接的建立和关闭过程
本文要求读者在阅读之前应该对TCP通过三次握手建立和关闭连接有一定的了解,本文并没有详细讲解三次握手,只是通过一个实例对三次握手进行了一下验证. tcp连接的建立和关闭想必大家都已经非常熟悉了!通过三 ...
- 计算机网络(11)-----TCP连接的建立和释放
TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序, ...
- [TCP/IP]TCP连接的建立和终止
TCP 是支持全双工通信的传输层协议,为了开发出更好的网络通信应用,清楚了解其中的交互过程是非常必要的. 下面用比较直白的话来描述&理解一下这个过程: TCP 连接建立:三次握手 服务器依次调 ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- 从Wireshark看TCP连接的建立与关闭
TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP ...
- TCP连接的建立和终止
TCP的简要要说明 标签(空格分隔): TCP 网络编程 Linux 面试 在此输入正文 一.TCP是什么 TCP全称传输控制协议(Transmission Control Protocol).TCP ...
- 简述TCP连接的建立与释放(三次握手、四次挥手)
在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...
- 传输层(2)-TCP连接的建立和终止、TIME_WAIT状态
1.TCP连接的建立和终止 1)三路握手 客户端发送一个SYN(同步)分解,告诉服务器客户将在连接中发送的数据的初始序列号. 服务器发送确认客户的SYN(ACK),同时自己也得发送一个SYN分节,它含 ...
- TCP/IP详解学习笔记(13)-- TCP连接的建立与终止
1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...
随机推荐
- [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)
传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...
- 1、springboot+mybatis+zookeeper+dubbox+maven+pagehelper
一.创建普通的maven的web项目 2.配置KD42WF_Part1下的pom.xml <?xml version="1.0" encoding="UTF-8&q ...
- JUnit单元测试实践:测试工具类和方法(EmptyUtils)
以前的时候(读大学时),我认为写单元测试太费事了.现在,我改变看法了. 工作中,为了提高Web开发的质量和效率,近期又为了保证自己的工具类等一系列可复用组件的质量,我煞费苦心地开始认真学习和撰写单元测 ...
- display显示属性理解
display属性设置一个元素应如何显示,是我们在前端开发中常常使用的一个属性,其中,最常见的有: 目录 display:none;表示此元素将不被显示. display:block;将元素显示为块元 ...
- 0923如何利用mysqlbinlog日志闪回
转自 https://github.com/danfengcao/binlog2sql,感谢作者的提供 binlog2sql 从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始 ...
- POJ 3710
树的删边游戏.. 由于题目的特殊性,我们只需计算环的边数值.若为偶环,则直接把环的根节点置0.若为奇环,则留下一条边与根结点相连,并那它们的SG置0: 注意的是,两个点也可构成环,因为允许重边.所以, ...
- hadoop1.0.4升级到hadoop2.2 具体流程步骤
hadoop1.x 升级到hadoop2.2 本文參考了博客:http://blog.csdn.net/ajax_jquery/article/details/27311671,对一些地方做了改动. ...
- 开源前夕先给大家赞赏一下我用C语言开发的云贴吧 站点自己主动兼容-移动、手机、PC自己主动兼容云贴吧
开源前夕先给大家赞赏一下我用C语言开发的移动.手机.PC自己主动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自 ...
- python基于selenium+cv2+numpy实现登录某大型电商系统
首先贴上我的安装包 一.selenium安装 I.打开pycharm,点击Settings,找到Project Interpreter,点击右边的下拉菜单下的show All...选项 II.点击sh ...
- Android下添加新的自定义键值和按键处理流程【转】
本文转载自: Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一 ...