说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

对WinSock和TCP/IP协议共同工作的疑惑 请高手指点迷津

编辑:说三道四文库 发布时间:2018-07-19 08:09
HTML文档下载 WORD文档下载 PDF文档下载
我用的是CAsyncSocket类 实现原理和直接调用winsock api 应该是差不多的

1.如何才算成功的建立一个连接
 首先我对TCP协议三次握手不明白 
a 与 b 连接 
a发送一个SYN数据报1  
b回应一个SYN ACK数据报2 
a再发送一个确认ASK数据报3

如果数据报3没有被b接到 算不算成功的建立了一个连接
a如果不通过下一个数据报怎么知道b是否接到了数据报3 所以a应该不知道是否成功的建立了连接 所以建立连接这个概念很模糊

2.套接字如果完成三次握手的
connect 发送数据报1(和上面说的对应) 
accept 发送数据报2 
数据报3 哪个套接字函数来发送??

3.我用windows 的CAsyncSocket 建立一个点对点连接
在服务器的listen 后下了一个断点 不让它调用accept 函数 连接应该无法建立
却发现客户端的mysock.Connect()仍然返回0 并且回调了OnSend函数 这一点非常的不理解
1. a收到数据报2,a认为连接建立成功;b没有收到3,不能确认建立成功,会超时重发syn ack。连接建立是两个方向上的问题。这种情况下a给b发送数据是没有问题的,数据报中的ack字段内容,实际上和你的数据报3是一样的。

2.都不是,connect发送syn,收到数据报2就成功建立连接返回。socket模型下的服务器,连接建立以后才会被accpet接受,也就是说服务器收到了数据报3,accept才返回。而将服务器配置为被动打开是通过listen。

3.见2的解释。
谢谢zengpan_panpan() 解释的非常好 
只是回答2中是不是应该改做"都不是,connect发送syn,收到数据报2,并发送数据报3就成功建立连接返回...."

connect应该是在三次握手建立连接之后才能正确返回。其底层的实现就是tcp的三次握手.
xiaohyy(醉大饿极) 注意看我的问题3
up
realmiss对2的修改是合理的,我只是站在connect的角度说的,它并不理解tcp/ip栈的问题。socket模型并不限于tcp/ip栈。

看来xiaohyy对三次握手建立连接的概念还是模糊的。
connect收到对方对自己的syn的响应,发送ack以后就返回了。
这个时候connect认为连接已经完成了,但这未必就意味着对方认为连接完成,如果对方收不到ack,还会重发syn ack。
连接是两个方向的,是两个方面的问题。

to zengpan_panpan() :
    非也,我不是对三次握手建立连接的概念模糊,而是对connect的实现模糊:),多谢指正。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘