使用TCP协议进行网络通讯时,通信的两端首先需要建立起一条连接链路,当然这并不表示使用UDP通信不需要“连接链路”,这里说的连接链路指的是通信协议范畴的东东,并不是物理介质或者电磁波信号,只所以说TCP是面向连接的网络通信协议,主要是指双方在通信时都会保持一些连接相关的信息,比如已收到的分组的序列号,下一次需要收到的分组的序号,对方的滑动窗口信息等等。
OK,闲话少扯,我们进入主题,下面结合一个简单的TCP服务端与客户端代码,借助tcpdump命令来分析一下TCP建立连接时的三次握手过程(Three-way handshake process)。
服务端代码如下:
/**
* server.c
*
* TCP server program, it is a simple example only.
*
* Writen By: Zhou Jianchun
* Date: 2011.08.12
*
* Compiled With: gcc -o client client.c
* Tested On: Ubuntu 11.04 LTS
*
* gcc version: 4.5.2
*
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <strings.h>
#include <string.h>
#define SERVER_PORT 20000
#define LENGTH_OF_LISTEN_QUEUE 10
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to our server."
int main(int argc, char **argv)
{
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error, exit!\n");
exit(1);
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
se