实战tcpdump看RST
??強(qiáng)烈推薦人工智能學(xué)習(xí)網(wǎng)站??? ? ? ? ? ? ?
RST為重置報(bào)文段,它會(huì)導(dǎo)致TCP連接的快速拆遷,且不需要ack進(jìn)行確認(rèn)。
1.針對(duì)不存在的端口的連請(qǐng)求
客戶端:
?
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <netinet/tcp.h> #define MAXLINE 4096int main() {int sockfd,ret;struct sockaddr_in servaddr;char sendbuf[32740]={0};sockfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));printf("ret=%d\n",ret);write(sockfd,sendbuf,sizeof(sendbuf)+1);getchar();close(sockfd);return 0; }?
編譯并運(yùn)行,此時(shí)沒(méi)有服務(wù)端在8888端口進(jìn)行監(jiān)聽(tīng),tcpdump抓包看。
?
07:19:32.643476 IP 127.0.0.1.49028 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 1270070893, win 65495, options [mss 65495,sackOK,TS val 3883769366 ecr 0,nop,wscale 7], length 0 07:19:32.643491 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49028: Flags [R.], seq 0, ack 1270070894, win 0, length 0客戶端發(fā)起連接,但受到一個(gè)RST包。
?
?
2.請(qǐng)求超時(shí)
因?yàn)榭蛻舳丝梢栽O(shè)置接收數(shù)據(jù)的超時(shí)時(shí)間,當(dāng)客戶端調(diào)用connect函數(shù)發(fā)送SYN時(shí),由于客戶端收到服務(wù)端的SYN/ACK的時(shí)間超過(guò)了客戶端設(shè)置的等待時(shí)間,造成接收超時(shí)。當(dāng)服務(wù)端的SYN/ACK到達(dá)時(shí),客戶端回應(yīng)RST。
?
3.提前關(guān)閉
服務(wù)端:
?
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #define MAXLINE 4096int main() {int listenfd,acceptfd,n;socklen_t clilen;char recvbuf[100]={0};struct sockaddr_in cliaddr,servaddr;listenfd=socket(AF_INET,SOCK_STREAM,0);servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = INADDR_ANY; bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));listen(listenfd,5);clilen=sizeof(cliaddr);acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);n=recv(acceptfd,recvbuf,sizeof(recvbuf)-1,0);printf("n=%d\n",n); getchar();close(acceptfd);close(listenfd);return 0; }?
客戶端:
?
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <netinet/tcp.h> #define MAXLINE 4096int main() {int sockfd,ret;struct sockaddr_in servaddr;char sendbuf[1000]={0};sockfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));printf("ret=%d\n",ret);write(sockfd,sendbuf,sizeof(sendbuf)+1);getchar();close(sockfd);return 0; }?
先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端。客戶端每次發(fā)送1001個(gè)字節(jié),而服務(wù)端只接收了99個(gè)字節(jié),還有剩下的字節(jié)在接收緩沖區(qū)里面。此時(shí)先關(guān)閉服務(wù)端,用tcpdump抓包查看。
?
16:28:06.149336 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 3096824100, win 65495, options [mss 65495,sackOK,TS val 3916682872 ecr 0,nop,wscale 7], length 0 16:28:06.149354 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [S.], seq 1491431840, ack 3096824101, win 65483, options [mss 65495,sackOK,TS val 3916682872 ecr 3916682872,nop,wscale 7], length 0 16:28:06.149372 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3916682872 ecr 3916682872], length 0 16:28:06.149461 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [P.], seq 1:1002, ack 1, win 512, options [nop,nop,TS val 3916682872 ecr 3916682872], length 1001 16:28:06.149491 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [.], ack 1002, win 528, options [nop,nop,TS val 3916682872 ecr 3916682872], length 0 16:28:07.699933 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [R.], seq 1, ack 1002, win 528, options [nop,nop,TS val 3916684423 ecr 3916682872], length 0服務(wù)端沒(méi)有將數(shù)據(jù)全部接收完成,然后就關(guān)閉了,所以服務(wù)端產(chǎn)生了一個(gè)RST。
?
?
4.在一個(gè)已關(guān)閉的socket上發(fā)到數(shù)據(jù)
?
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #define MAXLINE 4096int main() {int listenfd,acceptfd,n;socklen_t clilen;char recvbuf[100]={0};struct sockaddr_in cliaddr,servaddr;listenfd=socket(AF_INET,SOCK_STREAM,0);servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = INADDR_ANY; bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));listen(listenfd,5);clilen=sizeof(cliaddr);acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);getchar();close(acceptfd);close(listenfd);return 0; }?
服務(wù)端:
?
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <netinet/tcp.h> #define MAXLINE 4096int main() {int sockfd,ret;struct sockaddr_in servaddr;char sendbuf[1000]={0};sockfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(8888);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));printf("ret=%d\n",ret);getchar();write(sockfd,sendbuf,sizeof(sendbuf)+1);getchar();close(sockfd);return 0; }
先打開(kāi)服務(wù)端,在打開(kāi)客戶端。然后關(guān)閉服務(wù)端,在客戶端按下回車鍵鍵,用tcpdump抓包查看結(jié)果。
?
?
16:44:16.226353 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 3249455833, win 65495, options [mss 65495,sackOK,TS val 3917652949 ecr 0,nop,wscale 7], length 0 16:44:16.226370 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [S.], seq 1092997986, ack 3249455834, win 65483, options [mss 65495,sackOK,TS val 3917652949 ecr 3917652949,nop,wscale 7], length 0 16:44:16.226387 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3917652949 ecr 3917652949], length 0 16:44:18.402946 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 3917655126 ecr 3917652949], length 0 16:44:18.403887 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 2, win 512, options [nop,nop,TS val 3917655127 ecr 3917655126], length 0 16:44:20.376861 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [P.], seq 1:1002, ack 2, win 512, options [nop,nop,TS val 3917657100 ecr 3917655126], length 1001 16:44:20.376874 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [R], seq 1092997988, win 0, length 0客戶端和服務(wù)端建立連接之后,服務(wù)端就關(guān)閉了。此時(shí)客戶端再向服務(wù)端發(fā)送數(shù)據(jù),此時(shí)服務(wù)端返回RST。
?
?
?
?
參考地址:http://www.360doc.com/content/13/0702/10/1073512_297069771.shtml
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的实战tcpdump看RST的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TCP/IP包结构
- 下一篇: 实战测试SO_REUSEADDR选项