本文要求读者在阅读之前应该对TCP通过三次握手建立和关闭连接有一定的了解,本文并没有详细讲解三次握手,只是通过一个实例对三次握手进行了一下验证。

  tcp连接的建立和关闭想必大家都已经非常熟悉了!通过三次握手建立连接和通过三次或者四次(半关闭)握手来关闭连接!在这里,我想通过一个具体的实例程序,来分析一下这个过程!

  首先说用到的工具吧,linux下的tcpdump命令,和自己用c语言写的一个服务器端和一个客户端程序。程序的代码如下:

  头文件:

 #include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<errno.h>
#include<signal.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<arpa/inet.h>

Header

  服务器端:

 #include"header.h"
int main(int argc,char *argv[])
{
int socket_n; //套接字描述符
int listen_s; //监听套接字描述符
socklen_t cli_addr_len; //客户端地址长度
struct sockaddr_in server_addr; //服务器地址
struct sockaddr_in client_addr; //客户端地址 int n=; //接受到的数据长度
char buffer[]; //数据缓冲区
int maxLen=sizeof(buffer);
memset(buffer,,maxLen);
char cli_addr[]; //回创建监听套接字
listen_s=socket(AF_INET,SOCK_STREAM,); //创建本地服务器套接字
memset(&server_addr,,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port=htons(); //将套接字绑定到本地套接字地址
if(bind(listen_s,(struct sockaddr *)&server_addr,sizeof(server_addr)) < )
{
perror("Error:binding failed!");
exit();
}
//监听链接请求
if(listen(listen_s,maxLen) < )
{
perror("Error:listening failed!");
exit();
} while()
{
if((socket_n=accept(listen_s,(struct sockaddr *)&client_addr,&cli_addr_len)) < )
{
perror("Error:accepting failed!");
exit();
}
read(socket_n,buffer,maxLen);
inet_ntop(AF_INET,&client_addr.sin_addr,cli_addr,sizeof(cli_addr));
printf("%s sent %s",cli_addr,buffer);
write(socket_n,buffer,strlen(buffer));
printf("刚刚建立的连接即将关闭\n");
close(socket_n);
}
return ;
}

Server

  客户端:

 #include"header.h"
int main(int argc,char *argv[])
{
int sockfd;
char buffer_s[];
char buffer_r[];
struct sockaddr_in servaddr; memset(buffer_r,,sizeof(buffer_r));
memset(buffer_s,,sizeof(buffer_s)); if(argc != )
{
printf("usage : client <IP address>!");
exit();
} sockfd = socket(AF_INET,SOCK_STREAM,); memset(&servaddr,,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons();
inet_pton(AF_INET,argv[],&servaddr.sin_addr); connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); while(fgets(buffer_s,,stdin) != NULL)
{
write(sockfd,buffer_s,strlen(buffer_s));
if(read(sockfd,buffer_r,) == )
{
printf("client:server terminated prematurely");
}
fputs(buffer_r,stdout);
} return ;
}

Client

  tcpdump用的命令是这句:

tcpdump -i lo tcp port  and host 127.0.0.1

  这条命令表示,我抓取lo网卡(环回接口)上ip为127.0.0.1且端口号为9877(这个9877是我的程序中服务器绑定的接口)的包!

  运行的结果如下图:

  

  客户端发送一个"a\n"给服务器,并且接收到一个"a\n";

  

  这个截的图有点多了,这个与本文有关的部分就是最底下的从./server 开始的部分,服务器接受到一个"a\n",回传给客户端之后立刻将这个连接关闭,并且提示"刚刚建立的连接即将关闭"!

  

  这个是抓包软件抓到的图,这个就得好好分析分析了!

  首先需要说明几点的是,这个分析是从那个15:32:38.348872开始,那个38264表示的是客户端的端口号,9877表示的是服务器的端口号,关于有些包的符号位(图中flags部分)中应该有ACK这个标志,可是具体没有显示,我认为可能是tcpdump省略了,还有些包中的SYN符号(用一个S表示)也可能省略了。另外需要说明的一点是服务器和客户端的序号应该都是随机数,可是连接建立之后就自动从1开始,我认为这个是tcpdump这个软件自动进行了计算!

  第一条信息表示客户端发送给服务器一个包,其序号seq为598232472,标志位为SYN,就是建立连接的第一次握手。客户端发送自己的序号。

  第二条信息表示服务器发送给客户端一个包,其序号seq为3283581888,确认号为5982324272,标志位为SYC(理论上还应该有ACK,可能这里没有显示出来),这就是建立连接的第二次握手,服务器发送这边的序号,并对客户端的序号进行确认。

  第三条信息表示客户端发送给服务器一个包,没有序号,确认号为1(我认为这里是tcpdump这个抓包软件进行了处理),表示想要从服务器接受第一个字节,到这里,三次握手已经完成,客户端到服务器的连接已经建立。

  第四条信息表示客户端发送两个字节的信息给服务器,序号seq为1,确认号为1。标志位为PSH(表示不在窗口里面缓存,直接交给应用程序)。

  第五条信息表示服务器对客户端发送的信息表示确认,确认号为3,没有序号。

  第六条信息表示服务器发送给客户端两个字节的信息,序号为1,确认号为3.符号位为PSH。

  第七条信息表示服务器发送给客户端一个连接终止的FIN信息。序号为3,确认号为3,从这里开始了连接关闭的三次握手过程。(这里是服务器主动关闭的,所以三次握手就变成了二次握手~~)。

  第八条信息表示客户端发送给服务器的一个确认信息,确认号为3,表示对服务器发送的那两个字节的确认。

  第九条信息表示客户端发送一个确认信息给服务器,确认号为4,表示对服务器发送的FIN终止信息进行确认,至此,那个TCP连接也就关闭了。

  OK,这就是三次握手的实例,希望能够帮助大家更好地理解三次握手这个过程。

利用tcpdump分析工具来验证tcp连接的建立和关闭过程的更多相关文章

  1. 从Wireshark看TCP连接的建立与关闭

    TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP ...

  2. 网络学习笔记(一):TCP连接的建立与关闭

      五层网络模型分为:物理层.数据链路层.网络层.传输层.应用层.其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议).无连接的UD ...

  3. TCP连接的建立与终止过程详解

    TCP连接的建立与终止: 1.TCP连接的建立      设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客 ...

  4. 第三次作业:使用Packet Tracer分析TCP连接的建立与释放过程

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 使用路由器连接不同的网络 使用命令行操作路由器 通过抓取HTTP报文,分析TCP连接建立的过程 2 实验内容 使用Packe ...

  5. TCP连接的建立与关闭

    TCP是主机对主机层的传输控制协议:建立连接要三个握手,断开连接要四次挥手. 位码即TCP标志位,有6种标示:SYN(synchronous建立联机),ACK(acknowledgement 确认), ...

  6. Wireshark-TCP协议分析(包结构以及连接的建立和释放)

    原文:http://blog.csdn.net/ahafg/article/details/51039584 TCP:传输控制协议 TCP是一种面向连接的.可靠的.基于字节流的传输层通信协议.  面向 ...

  7. TCP连接的状态与关闭方式及其对Server与Client的影响

    TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...

  8. TCP连接的状态与关闭方式,及其对Server与Client的影响

    1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...

  9. TCP连接的建立以及利用tcpdump分析连接建立的过程(转)

    原文地址:http://www.cnblogs.com/coser/archive/2010/12/05/1968812.html 一.实验目的 实验1_1: 使用Freebsd/Linux操作系统下 ...

随机推荐

  1. spyder在虚拟机上运行内核一直崩溃

    可能的原因是因为虚拟机设置的内存过小了

  2. php protected 类型如何获取

    感谢 https://blog.csdn.net/m0_38092942/article/details/81354184 比如对象如下 object(App\User)#265 (28) { [&q ...

  3. AForge,Emgu.CV抓拍图像大小

    原文:AForge,Emgu.CV抓拍图像大小 2017年,忙忙碌碌地过去了,象往年一样,依然没有时间上CSDN,博客园. 这一年是打工以来最辛苦的一年. 这一年用了不少自己没有接触过的东西.如人脸识 ...

  4. Latex表格制作记录

    Latex表格制作记录 主要功能 合并表格的行列 长表格的使用 makecell例程借鉴 效果图 参考代码 \documentclass{ctexart} \usepackage{indentfirs ...

  5. 从Set里面取出有序的记录

    Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...

  6. [Angular] Using NO_ERRORS_SCHEMA

    For example, when testing container component we might import lots of children components, but we di ...

  7. 使用ToolRunner运行Hadoop程序基本原理分析 分类: A1_HADOOP 2014-08-22 11:03 3462人阅读 评论(1) 收藏

    为了简化命令行方式运行作业,Hadoop自带了一些辅助类.GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对象设置相应的 ...

  8. [TypeScript] Find the repeated item in an array using TypeScript

    Say you have an array that has at least one item repeated. How would you find the repeated item. Thi ...

  9. JNI_Android 项目中调用.so动态库实现详解

    转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj. ...

  10. JBoss AS 7之初步了解(The Return Of The King)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9obl9mX2xhdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...