unp----函数connect结合tcp三路握手原理分析

来源:互联网 发布:男士手表知乎 编辑:程序博客网 时间:2024/05/23 16:22


建立一个tcp连接的情景:

(1)服务器在接受外来的链接的时候。调用socket,bind, listen这三个函数来完成,我们称之为被动打开(passive open)

(2)当我们调用connect发起主动打开(active open)。这样tcp客服端将会发送一个SYN(同步)分节给服务器。该SYN分节不携带任何数据。

(3)当服务器接收到了来自客服端的SYN分节,就发送ACK给tcp客服端,同时服务器也要发送一个SYN分节给tcp客服端。

(4)当tcp客服端确定收到服务器的 SYN分节。

就这样完成了tcp三握手


tcp客服通过connect函数来完成与服务器之间的连接:

#include <sys/socket.h>

int connect(int sockfd,  const struct sockaddr  *servaddr,  socklen_t len)

成功则返回0,出错则返回为-1

当出错的时候其错误原因全部存到了errno里面

1.若tcp客服收到了来自服务器的响应是RST(复位),则errno = ECONNREFUSED,这是一种硬错误(hard error)。出现的原因:很有可能是服务器主机已经连接到了局域网范围内,并且获得了其IP地址,但是指定的端口上没有进程与之连接(即没有运行服务器进程)

RST是tcp发生错误的时候发送的一种tcp分节:

产生RST的三个条件:

(1):目的端口SYN分节已经到达,该端口在服务器上面没有被监听(如1中原因)

(2):tcp客户取消了一个已有连接

(3):TCP接受到了一个不存在的连接上的分节

2.客服发出的SYN分节没有到达tcp服务器,在路由上面引发了一个ICMP错误,则errno = EHOSTUNREACH 或者errno = ENETUNREACH(通常情况下两种错误作为一种情况对待,因为ENETUNREACH被认为已经超时)

以下两种情况会出现上诉原因:

(1)按照本地的系统表没有找到到达远程系统的路径

(2)connect不等待就返回

3.TCP客户端没有收到来来自TCP服务的SYN分节,则 errno = ETIMEDOUT。出现的原因描述:如果在本地的子网中,存在192.168.1.100的ip,但是没有主机连接上来。


参考资料:unix网络编程,4.3connect函数。