jehol.liuyang
本文仅涉及对基本的建连过程的讨论,同时打开、建连失败处理等异常流程均不涉及,后期有时间会逐步完善;
另外,因时间仓促,加之能力有限,文章错误之处在所难免,敬请批评指正
TCP建连状态机
TCP建立过程就是相互发送信息,驱动客户端、服务器状态变化至于稳定可通信状态的过程,我们先给出状态变迁图,后面的论述都将围绕此展开
图1.TCP状态变迁图
接口层代码
我们日常应用TCP协议都是通过调用接口层的系统调用完成的,下面摘录了两段服务器和客户端建立TCP连接的代码,我们主要关注建立连接部分(其他部分被省略了),接下来将通过代码中的系统调用深入内核代码去看看TCP三次握手背后的逻辑
int main(int argc, char *argv[])
{
int server_sockfd;//服务器端套接字
int client_sockfd;//客户端套接字
int len;
struct sockaddr_in my_addr; //服务器网络地址结构体
struct sockaddr_in remote_addr; //客户端网络地址结构体
int sin_size;
char buf[BUFSIZ]; //数据传送的缓冲区
memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
my_addr.sin_family=AF_INET; //设置为IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
my_addr.sin_port=htons(8000); //服务器端口号