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 包,使得带敏感信息的网页无法被我们浏览到。




进阶篇:

TCP 连接的建立和终止过程
  TCP连接是面向连接的,所谓的面向连接就是,当计算机双向通信时必需先建立连接,然后才能进行数据的传输,最后还要拆除连接。而同在一个网络层的UDP传输,是面向非连接的传输,也不是可靠的。
 TCP建立连接需要三次握手的过程,而拆除连接需要四次握手的过程。
 TCP连接的建立:
  1.服务器必须准备好接受外来的连接,这通过调用socket,bind,和listen函数来完成,称为被动打开。
  2.客户通过调用connect进行主动打开,这引起客户TCP发送一个SYN(Synchronize)分节(表示同步 SYN=J),它告诉服务器客户将在连接中发送的数据的初始序列号,一般情况下SYN分节不携带数据,它只包含有一
个IP头部,一个TCP头部,可能还有TCP选项。这时客户端进入SYN_SEND状态,并等待服务器确认。
3. 服务器必须确认客户的SYN,同时自己也要发送一个SYN分节,它含有服务器将在同一个连接中发送的数据的初始序列号,服务器向客户发送一个SYN(SYn=K)和对客户的ACK(J+1)。也就是SYN+ACK包。这里服务器
进入SYN_RECV状态。
4 客户必须确认服务器的SYN。这里会向服务器发送确认包ACK(ack = K+1),此包发送完毕,客户端和服务器专进入ESTABLISHED状态。至此,三次握手完成,TCP连接建立。
  完成三次握手,客户端和服务器开始传输数据。在握手过程中,ACK里的确认号为发送这个 ACK的一方所期待的对方的下一个序列号。因为SYN只占一个字节的序列号空间,所以每一个SYN的ACK中的确认号都是相应的初始序列号加1,每一个FIN的ACK的确认号为FIN的序列号加1、
  在这过程中,还有一些重要的概念需要能明白。
SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。所以如果你拒绝进来的syn包,它将终止其他计算机打开你计算机上的服务,但是并不会你终止你使用别的计算机的服务。

FIN:结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。
RST:复位标志
复位标志有效。用于复位相应的TCP连接。
URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,
PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的
 
 未连接队列:
   在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN 包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器 进入ESTABLISHED状态。Backlog参数:表示未连接队列的最大容纳数目。
SYN-ACK重传次数 :
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超 过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。

注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

TCP选项:
   每一个SYN可以含有若干个TCP选项,通常使用的选项有:
MSS选项:TCP发送的SYN中,带有这个选项是通知对方它的最大分节大小MSS(maximum segment size),即它能接受的每个TCP分节中的最大数据量,可以使用TCP_MAXSEG套接口选项获取与设置这个TCP选项(Linux系统下)。
 窗口规模选项:TCP双方能够通知对方的最大窗口大小是65535,因为TCP头部相应的字段只占16位,这个选项指定TCP头部的广告窗口必须扩大(左移)的位数(0--14),因此所提供的最大窗口几乎是1G字节(65535*2的14次方)
时间戳选项:这个这项对高速连接是必要的,它可以防止失而复得的分组可能造成的数据损坏,也就是说是暂时的路由原因造成的迷途的分组,当路由稳定后,它们又会正常到达目的地,其前提是它们在此前尚未被路由主动丢弃。

TCP连接终止:
 TCP用三次握手建立一个连接,而终止一个连接则需要四次握手。
1. 某个应用进程首先调用close,我们称这一端执行主动关闭(active close),这一端的TCP于是发送一个FIN分节,表示数据发送完毕。
2. 接收到FIN的另一端执行被动关闭,这个FIN由TCP确认,它的接收也作为文件结束符,传递给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着应用进程在相应连接上再也接收不到额外数据。
3. 一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口,这导致它的TCP也发送一个FIN、
4. 接收到这个FIN的源发送方TCP,对它进行确认。发送ACK、
 FIN占据1个字节的序列号空间,这与SYN相同,所以每个FIN的ACK确认号是这个 FIN的序列号加1.
在步骤2与步骤3之间可以有从执行被动关闭端到执行主动关闭端的数据流,这称为半关闭。不管是客户还是服务器都可以执行主动关闭。通常情况下是客户执行主动关闭。


注意:
四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记请注意RST包是可以不要收到方确认的
下面是一个简单的TCP连接的例子:其中涉及到了主要的数据包的变化。

握手阶段:
序号 方向    seq           ack
1  A->B 10000          0
2      B->A   20000   10000+1=10001
3     A->B   10001     20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001
数据传输阶段:
序号  方向    seq      ack    size
23          A->B           40000 70000 1514
24          B->A           70000 40000+1514-54=41460 54
25          A->B           41460 70000+54-54=70000 1514
26          B->A           70000 41460+1514-54=42920 54

解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包
24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP协议三次握手是为了在客户端和服务端建立一个安全可靠的连接。在第三次握手时,客户端能够发出第三次握手报文,表示已经接收到来自服务端的第二次握手报文,从而确认连接建立。此时,服务端的状态会切换为ESTABLISHED,可以开始传输据了。\[1\] 三次握手的过程如下: 1. 客户端发送一个连接请求报文给服务端,表示想要建立连接。 2. 服务端接收到请求后,发送一个确认报文给客户端,表示已经收到请求。 3. 客户端接收到确认报文后,再次向服务端发送一个确认报文,表示已经收到服务端的确认。 至于为什么不进行四次握手,实际上是可以的,即在服务端收到客户端的第一次连接请求后,可以将ACK和SYN分两次发送给客户端。但这样做会浪费资源,因为一次能完成的事情为什么要分为两次呢?所以,TCP/IP协议采用了三次握手的机制来建立连接。\[2\]\[3\] #### 引用[.reference_title] - *1* [TCP/IP协议、三次握手、四次挥手详解](https://blog.csdn.net/Q0717168/article/details/111933810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [TCP三次握手和四次挥手(详细+通俗)](https://blog.csdn.net/m0_38089031/article/details/108567936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值