tcp三次握手的资料

上传人:第*** 文档编号:32698395 上传时间:2018-02-12 格式:DOC 页数:21 大小:110.50KB
返回 下载 相关 举报
tcp三次握手的资料_第1页
第1页 / 共21页
tcp三次握手的资料_第2页
第2页 / 共21页
tcp三次握手的资料_第3页
第3页 / 共21页
tcp三次握手的资料_第4页
第4页 / 共21页
tcp三次握手的资料_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《tcp三次握手的资料》由会员分享,可在线阅读,更多相关《tcp三次握手的资料(21页珍藏版)》请在金锄头文库上搜索。

1、次我用 winpcap 成功发送一个 UDP 数据包到服务器。 相比较 TCP 要复杂的多, tcp 不但要完成开始连接的三次握手, 还要处理数据包的序列号。 下面是 tcp 七次握手示意图:下面我就来模拟一个 TCP 客服端,发送一个连接到服务器, 服务器之后断开。这样就是7 次握手, 不含其他数据包。首先我们做一个 tcp 服务器, 最好是一个公网的, 这样连接就更有真实性。服务器代码:view plaincopy to clipboardprint?#include #include #include #include #pragma comment (lib,ws2_32.lib) S

2、OCKET tcpServerSocket = 0; SOCKADDR_IN tcpServerAddr = 0 ; const int backlog = SOMAXCONN; WSADATA wsaData = 0 ; int ret_code; #define PORT 7456 /server port #define IPSTRING 122.*.*.* /server ip / void error(const char* errstr, int errcode) printf(Error: %sn, errstr); printf(Error Code: %sn, errcode

3、); void error_exit(const char* errstr, int errcode) error(errstr, errcode); exit(errcode); void main() ret_code = WSAStartup( MAKEWORD( 2, 2 ), if ( ret_code != 0 ) error_exit(WSAStartup error, ret_code); / if(tcpServerSocket = socket(AF_INET, SOCK_STREAM, 0) = INVALID_SOCKET) error_exit(socket erro

4、r, WSAGetLastError(); /IP tcpServerAddr.sin_family = AF_INET; tcpServerAddr.sin_port = htons(PORT); tcpServerAddr.sin_addr.S_un.S_addr = inet_addr(IPSTRING); if(bind(tcpServerSocket, (struct sockaddr *)&tcpServerAddr, sizeof(tcpServerAddr) = SOCKET_ERROR) error_exit(bind error, WSAGetLastError(); if

5、(listen(tcpServerSocket, backlog) = SOCKET_ERROR) error_exit(listen error, WSAGetLastError(); while(true) SOCKET tcpClientSocket = 0; SOCKADDR_IN tcpClientAddr = 0 ; int tcpClientAddrLen = sizeof(SOCKADDR_IN); if(tcpClientSocket = accept(tcpServerSocket, (struct sockaddr *)&tcpClientAddr, &tcpClient

6、AddrLen) = INVALID_SOCKET) error_exit(accept error, WSAGetLastError(); continue; printf(From IP = %s Port = %dn, inet_ntoa(tcpClientAddr.sin_addr), ntohs(tcpClientAddr.sin_port); / /recv /send closesocket(tcpClientSocket); #include #include #include #include #pragma comment (lib,ws2_32.lib)SOCKET tc

7、pServerSocket = 0;SOCKADDR_IN tcpServerAddr = 0 ;const int backlog = SOMAXCONN;WSADATA wsaData = 0 ; int ret_code;#define PORT 7456 /server port#define IPSTRING 122.*.*.* /server ip/void error(const char* errstr, int errcode)printf(Error: %sn, errstr);printf(Error Code: %sn, errcode);void error_exit

8、(const char* errstr, int errcode)error(errstr, errcode);exit(errcode);void main()ret_code = WSAStartup( MAKEWORD( 2, 2 ), if ( ret_code != 0 ) error_exit(WSAStartup error, ret_code); / if(tcpServerSocket = socket(AF_INET, SOCK_STREAM, 0) = INVALID_SOCKET)error_exit(socket error, WSAGetLastError(); /

9、IPtcpServerAddr.sin_family = AF_INET;tcpServerAddr.sin_port = htons(PORT);tcpServerAddr.sin_addr.S_un.S_addr = inet_addr(IPSTRING);if(bind(tcpServerSocket, (struct sockaddr *)&tcpServerAddr, sizeof(tcpServerAddr) = SOCKET_ERROR)error_exit(bind error, WSAGetLastError();if(listen(tcpServerSocket, back

10、log) = SOCKET_ERROR)error_exit(listen error, WSAGetLastError();while(true)SOCKET tcpClientSocket = 0;SOCKADDR_IN tcpClientAddr = 0 ;int tcpClientAddrLen = sizeof(SOCKADDR_IN);if(tcpClientSocket = accept(tcpServerSocket, (struct sockaddr *)&tcpClientAddr, &tcpClientAddrLen) = INVALID_SOCKET)error_exi

11、t(accept error, WSAGetLastError();continue;printf(From IP = %s Port = %dn, inet_ntoa(tcpClientAddr.sin_addr), ntohs(tcpClientAddr.sin_port);/recv/sendclosesocket(tcpClientSocket); 好了服务器是做好了, 现在主要是做客服端了。在发送数据包之前, 我们要知道数据包的结构, 对一个 TCP 数据包结构像这个样子:【以太网头】 【IP 头】 【TCP 头】 【数据】由于握手过程数据可以空, 所以只有三个部分。 各种数据包头如

12、下声明(注意我这里给出的是小端模式) , 大部分数从 linux 系统里面 copy 过来。 对数据包详细信息, 这里就不多说了。view plaincopy to clipboardprint?#include #pragma comment(lib, wpcap.lib) #include #pragma comment(lib, Ws2_32.lib) #define ETHER_ADDR_LEN 6 /from linuxs ethernet.h #define ETHERTYPE_IP 0x0800 /* IP */ /以太网数据头 struct ether_header u_cha

13、r ether_dhostETHER_ADDR_LEN; u_char ether_shostETHER_ADDR_LEN; u_short ether_type; /如果上一层为 IP 协议。则 ether_type 的值就是 0x0800 ; /IP 数据头 struct ip_header /小端模式 unsigned char ihl:4; /ip header length unsigned char version:4; /version u_char tos; /type of service u_short tot_len; /total length u_short id; /identification u_short frag_off; /fragment offset u_char ttl; /time to live u_char protocol; /protocol type u_short check; /check sum u_int saddr; /source address

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号