利用tcpdump分析工具來驗證tcp串連的建立和關閉過程,tcpdumptcp

來源:互聯網
上載者:User

利用tcpdump分析工具來驗證tcp串連的建立和關閉過程,tcpdumptcp

  本文要求讀者在閱讀之前應該對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=0; //接受到的資料長度11 char buffer[256]; //資料緩衝區12 int maxLen=sizeof(buffer);13 memset(buffer,0,maxLen);14 char cli_addr[20];15 16 //回建立監聽通訊端17 listen_s=socket(AF_INET,SOCK_STREAM,0);18 19 //建立本機伺服器通訊端20 memset(&server_addr,0,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(9877);24 25 //將通訊端綁定到本地通訊端地址26 if(bind(listen_s,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)27 {28 perror("Error:binding failed!");29 exit(0);30 }31 //監聽連結請求32 if(listen(listen_s,maxLen) < 0)33 {34 perror("Error:listening failed!");35 exit(1);36 }37 38 while(1)39 {40 if((socket_n=accept(listen_s,(struct sockaddr *)&client_addr,&cli_addr_len)) < 0)41 {42 perror("Error:accepting failed!");43 exit(1);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 0;53 }Server

  用戶端:

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

  tcpdump用的命令是這句:

tcpdump -i lo tcp port 9877 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,這就是三向交握的執行個體,希望能夠協助大家更好地理解三向交握這個過程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.