TCP/IP三次握手 的学习笔记及理解

简单的过程如下:

客户端A 与 服务器 B 建立 TCP 连接时, 首先  A  向 B 先发送  SYN (同步请求), 然后 B  回复 SYN + ACK(同步请求应答)

最后 A 回复 ACK 确认,这样, TCP 的一次连接 (三次握手) 的过程就建立了。


在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手来建立一个连接。

第一次握手:建立连接时, Client 发送 SYN 包(SYN = j)到Server,并进入 SYN_SEND 状态,等待 Server 确认;

第二次握手:server 接到 SYN 包,必须确认 client 的 SYN (ack = j + 1 ),同时自己也发送一个 SYN 包(SYN = k),

                        即 SYN + ACK 包,此时服务器进入 SYN_RECV 状态;

第三次握手:Clinet 收到 Server 的 SYN+ACK 包,向server 发送确认包(ACK = K+1),此包发送完毕,server和 client 进入 ESTABLISHED 状态。


在三次握手过程中,重要的内部细节如下:

1.未连接队列。 在三次握手协议中,Server  维护一个未连接队列,该队列为每个 Client 的 SYN 包开设一个item,该条目表明 Server 已收到 SYN 包,

            并向 Client 发出确认,正在等待 Client 的 ACK 包,这些条目所标识的连接在 Server 处处于 SYN_RECV 状态,

           当 Server 收到 Client 的 ACK 包,删除该条目,服务器进入 ESTABLISHED 状态。其中, Backlog 参数表示未连接队列的最大容纳数目。

2.SYN-ACK 重传次数。Server 发送完 SYN + ACK 包,如果未收到 Client 的 ACK, Server 进行首次重传,等待一段时间仍未收到 Client 的 ACK,进行第二次重传。

           如果重传的次数超过系统规定的最大重传次数,系统将该连接信息从半连接queue中删除。注意,每次重传等待的时间不一定相同。

3.半连接存活时间。是指半连接queue的条目存活的最长时间,也即 Server 从收到 SYN 包到确认这个报文无效的最长时间,

          该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为 Timeout 时间, SYN_RECV 存活时间。  


SOCKET 编程和 TCP/IP 协议的关系。

当我们创建的 SOCKET 类型就决定了我们是数据流类型(TCP)还是数据报文型(UDP),创建这些类型的套接字的时候就已经带上了相应的协议栈,

这些握手信息在协议栈内部就实现了,不需要上层应用去实现。如果你想自己去控制握手信息,则需要创建原始套接字,这种类型的套接字是基于IP层的,

很多抓包工具就是通过这种类型的套接字来实现的。在这一层上你就可以自己定义处理握手信息,但是这样相当于你要自己来实现TCPip协议栈了,

这难度太高,而且一般情况下也是没有必要的,如果只是对握手的过程感兴趣的话,可以安装一个转包工具观察一下连接过程 C/S 之间的通讯数据包就可以了。

一句话:socket 原语就是要隐藏握手的细节。
Socket存在的目的就是为了避免开发者接触三次握手在内的细节,如果你为路由器信息过滤,或者是开发带网络功能的os,就需要了解TCPIP的纤细资料了。
中国的过滤设备会对连接的双方发送伪造的 RST 包,中断一个 TCP 包,使得带敏感信息的网页无法被我们浏览到。


您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多