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


建立一个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函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值