【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (1)三次握手,四次挥手
18.1 引言
TCP 是一个面向连接的协议:无论哪一方 向 另一方 发送数据之前,都必须在双方之间建立一条连接。
UDP 与 TCP 完全不同,在发送数据之前 无需建立任何连接。这也说明了 TCP 的特性:reliable 。
18.2 连接的建立与终止
18.2.1
telnet命令在与 丢弃(discard) 服务 对应的端口上 与主机建立一条TCP连接。
显示序号 和 隐含结尾序号 的优点:便于了解数据字节数大于0时的 隐含结尾序号。
这个字段只有在满足以下条件时才显示:
- (1)报文段中 至少包含一个数据字节
- (2)SYN FIN 或者 RST 被设置为1 的时候
18.2.3 建立连接协议
三次握手
(1)请求端(client) 发送一个 SYN端 指明 1)客户打算连接的服务器的端口 2)初始序号 ISN
(2)接收端(server) 发回包含服务器的初始序号的 SYN报文段(含 ACK) 进行确认,同时 将确认序号(ACK字段 置为1时 有效)设置为 客户的初始序号ISN +1 以对客户的 SYN报文段 进行确认。
(3)客户 必须发送 **将确认序号 设置为 服务器的 ISN+1 **的 SYN报文段 进行确认(ACK)。
以上三个过程 称为“三次握手”。
(1)client ---Hello, can I speak to you? & client-ISN:J---> server
(2)client <---ACK: Yes, I receive your request! & server-ISN:K ACK:J+1--- server
(3)client ---ACK: Okey, thank you for your permission! Let's start! & ACK:K+1 ---> server
发送第一个 SYN 的一端(一般都由 客户端 client 发起),将执行 主动打开(active open)。 接收这个 SYN报文段 并 发送下一个带有ACK的 SYN报文段 的一端(一般都是 server),将执行 被动打开(passive open)。
当一端为建立连接 发送它的 SYN 的时候,它为连接选择一个 初始序号(ISN),初始序号的值 随时间的变化而变化。
选择序号的目的:防止在网络中 被延迟的分组 在之后又被传送,导致连接的一端做出错误的解释。我们将在后面的 “来自该连接的 较早替身 的迟到报文段” 再进行理解。
18.2.4 连接终止协议
四次挥手
连接终止 需要 四次挥手,而这是由 TCP的半关闭 导致的。TCP连接 是双全工的:通信允许两个方向进行传输。
由于 TCP连接 是 双全工 的,因此 每个方向都必须 单独的进行关闭。
第一次挥手:(1)首先进行发送的一方(一般是 client,但是 也可以是 server) 发送第一个 FIN 将执行 主动关闭,发送端的应用层关闭之后,才发送的 第一个FIN。 此时,发送端不能够再发送数据了,但是仍然可以接收数据。(附:这对 利用半关闭的应用 来说是可能的,但是很少的TCP应用程序这样做。)
第二次挥手:(2)接收到 第一个 FIN 的另外一方(一般是 server),返回一个 FIN的ACK 给发送端,确认序号 为 收到的序号+1。和 SYN 一样,FIN 也将占用一个序号。
(3)接着 接收端-server 向应用程序交送EOF(end of file),代表从 发送端 接收数据的结束。
第三次挥手:(4)接收端-server 关闭它的进程(关闭应用层),并发送 FIN 给 发送端-client。
第四次挥手:(5)发送端-client 接收到这个 FIN,并发送一个 FIN的ACK 给 接收端-server,确认序号 设置为 收到的序号+1。
注意:
- 确认序号 只有在 ACK字段为1 的情况下才有效,也就是说,发送请求的 是 序号,返回的ACK 是 确认序号(值为 序号+1)。
(1)client ---FIN: Hey,man. I finished my application, I will not send any data to you! Bye! & 序号 M ---> server
(2)client <---ACK: OKey, I will not receive your data. & 确认序号 M+1 --- server
(3)server ---EOF---> server-application
(4)client <---FIN: Goodbye, I will not send any data to you, too! & 序号 N --- server
(5)client ---ACK: Okey, bye! & 确认序号 N+1 ---> server
总的过程:
18.4 最大报文段长度
最大报文段长度(MSS) 表示TCP传往另外一端的最大块数据的长度。
当建立一个连接的时候,连接的双方都要通告各自的 MSS。
- 报文段越大 允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的 网络利用率。
- 对于一个以太网,MSS可达 1460字节,使用 IEEE 802.3的封装,它的MSS可达1452字节。
如果目的IP地址为 “非本地的(nonlocal)”, MSS 默认值为536.
区别地址 是 本地的 还是 非本地的:
- (1)目的IP地址的网络号和子网号 都和我们相同,一定是本地的。
- (2)目的IP地址的网络号和子网号 都和我们不同,一定是非本地的。
- (3)目的IP地址的网络号和我们相同,但是子网号不同,可能是本地的,也可能是非本地的。
MSS 让主机限制另外一端发送数据报的长度。
也就是说,数据报的长度,目前取决于两点:(1)建立连接时的 MSS (2)由 Traceroute(设置不分片)程序产生的数据报 确定的路径MTU。
通过这两点的限制,防止了数据报的分片。
2016/8/10