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

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

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

  头文件:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<netdb.h>
  7. #include<errno.h>
  8. #include<signal.h>
  9. #include<unistd.h>
  10. #include<string.h>
  11. #include<sys/wait.h>
  12. #include<arpa/inet.h>

Header

  服务器端:

  1. #include"header.h"
  2. int main(int argc,char *argv[])
  3. {
  4. int socket_n; //套接字描述符
  5. int listen_s; //监听套接字描述符
  6. socklen_t cli_addr_len; //客户端地址长度
  7. struct sockaddr_in server_addr; //服务器地址
  8. struct sockaddr_in client_addr; //客户端地址
  9.  
  10. int n=; //接受到的数据长度
  11. char buffer[]; //数据缓冲区
  12. int maxLen=sizeof(buffer);
  13. memset(buffer,,maxLen);
  14. char cli_addr[];
  15.  
  16. //回创建监听套接字
  17. listen_s=socket(AF_INET,SOCK_STREAM,);
  18.  
  19. //创建本地服务器套接字
  20. memset(&server_addr,,sizeof(server_addr));
  21. server_addr.sin_family = AF_INET;
  22. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  23. server_addr.sin_port=htons();
  24.  
  25. //将套接字绑定到本地套接字地址
  26. if(bind(listen_s,(struct sockaddr *)&server_addr,sizeof(server_addr)) < )
  27. {
  28. perror("Error:binding failed!");
  29. exit();
  30. }
  31. //监听链接请求
  32. if(listen(listen_s,maxLen) < )
  33. {
  34. perror("Error:listening failed!");
  35. exit();
  36. }
  37.  
  38. while()
  39. {
  40. if((socket_n=accept(listen_s,(struct sockaddr *)&client_addr,&cli_addr_len)) < )
  41. {
  42. perror("Error:accepting failed!");
  43. exit();
  44. }
  45. read(socket_n,buffer,maxLen);
  46. inet_ntop(AF_INET,&client_addr.sin_addr,cli_addr,sizeof(cli_addr));
  47. printf("%s sent %s",cli_addr,buffer);
  48. write(socket_n,buffer,strlen(buffer));
  49. printf("刚刚建立的连接即将关闭\n");
  50. close(socket_n);
  51. }
  52. return ;
  53. }

Server

  客户端:

  1. #include"header.h"
  2. int main(int argc,char *argv[])
  3. {
  4. int sockfd;
  5. char buffer_s[];
  6. char buffer_r[];
  7. struct sockaddr_in servaddr;
  8.  
  9. memset(buffer_r,,sizeof(buffer_r));
  10. memset(buffer_s,,sizeof(buffer_s));
  11.  
  12. if(argc != )
  13. {
  14. printf("usage : client <IP address>!");
  15. exit();
  16. }
  17.  
  18. sockfd = socket(AF_INET,SOCK_STREAM,);
  19.  
  20. memset(&servaddr,,sizeof(servaddr));
  21. servaddr.sin_family = AF_INET;
  22. servaddr.sin_port = htons();
  23. inet_pton(AF_INET,argv[],&servaddr.sin_addr);
  24.  
  25. connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  26.  
  27. while(fgets(buffer_s,,stdin) != NULL)
  28. {
  29. write(sockfd,buffer_s,strlen(buffer_s));
  30. if(read(sockfd,buffer_r,) == )
  31. {
  32. printf("client:server terminated prematurely");
  33. }
  34. fputs(buffer_r,stdout);
  35. }
  36.  
  37. return ;
  38. }

Client

  tcpdump用的命令是这句:

  1. 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. 【rlz02】二进制转十进制

    Time Limit: 3 second Memory Limit: 2 MB 问题描述 输入一个二进制数,编程转换为十进制数. 整数部分不会超过65535,二进制的小数部分不会超过4位. Sampl ...

  2. Html表单中遇到的问题

    原文 https://www.jianshu.com/p/4466b8294007 大纲 1.表单提交的方式GET和POST的区别 2.js无法对input的file类型的值进行赋值 3.js获取in ...

  3. Netty+WebSocket简单实现网页聊天

    基于Netty+WebSocket的网页聊天简单实现 一.pom依赖 <dependency>        <groupId>io.netty</groupId> ...

  4. 【32.22%】【codeforces 602B】Approximating a Constant Range

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. Loader之一:基本原理 分类: H1_ANDROID 2013-11-16 10:29 1923人阅读 评论(0) 收藏

    参考APIDEMO及http://developer.android.com/guide/components/loaders.html#app 1.Introduced in Android 3.0 ...

  6. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    Java 中无锁的线程安全整数 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候, 不可避免的会用到synchron ...

  7. 9个完整android开源app项目

    一.photoup 介绍: photoup 是一款开源的相册类app,主要功能是将本地图片提交到facebook上去,虽然他的功能和facebook的远程服务相关,但是本身是可以被当作一款 相册应用的 ...

  8. css3-6 表格如何设置样式和定位样式是什么

    css3-6 表格如何设置样式和定位样式是什么 一.总结 一句话总结:css可以解决所有属性设置的样式. 1.表格如何设置样式? css样式可以解决一切问题,没必要在表格上面加属性来设置样式. 7 t ...

  9. USB 3.0规范中译本 第6章 物理层

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 6.1 物理层概览 物理层定义超高速总线的信号技术.本章定义超高速物理层的电气要求. 本节定义超高速组件之间 ...

  10. ubuntu系统安装和配置

    1.分区信息 1.1 /boot分区 这个分区包括了操作系统的内核和在启动系统过程中所要用到的文件.假设有了一个单独的/boot启动分区,即使基本的根分区出现了问题,计算机依旧可以启动.这个分区的大小 ...