TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接传输协议,就像打电话一样一直占着线在聊天,而不是像邮件一样你一封我一封的通信。了解三次握手,四次断开之前有必要先学习一些基本概念,首先,最重要的是TCP的首部 , TCP的数据被装在一个IP数据包里面,如图,可以知道的是一个IP包里面有一个TCP报文段,一个TCP报文段里面有一个TCP首部
知道TCP首部有什么用?
TCP首部对于理解三次握手四次断开有比较关键的作用,如果不知道这些基础的概念,看到后面你就会晕头转向的。其中两个最重要的字段是 序列号字段和确认号字段。
另外比较重要的是 SYN(synchronous)同步比特位,ACK(Acknowledgement)确认比特位,FIN(finished)结束位
SYN和ACK比特位用来帮助建立TCP连接.
FIN和ACK比特位用来帮助释放TCP连接.
稍微计算一下,8位一个字节,端口号占用4个字节。所以总共5行,占用20字节的空间。最下面两行为TCP数据,在建立连接和释放的阶段属于可选项。
为什么要使用32位的序列号ISN呢?
序列号(ISN)是用来标记从TCP发送端到TCP接受端发送的字节流,请注意是字节流,一般序列号随着时间流递增。
比如发送数据阶段一段数据由500 000字节文件组成,一个TCP报文段装载1000字节,则有500个TCP报文段,那么第一个报文段的序列号为1,第二个报文段的序列号为1001,第三个报文段的序列号为2001
但是在建立连接和释放连接阶段的时候序列号一般只加一。
为什么使用ISN呢?这是因为在互联网上传数据经常会出现丢包的情况以及包延迟的情况。如果没有序列号,由于到达顺序不同,主机将不知道如何管理这些包。
例如序列号为0和2000的包已经送到主机,这时序列号为1000的包刚到,如果不知道这些序号,主机则不知道怎么排序这些数据。
确认号其包含了发送端所期望收到的下一个序列号(即收到的序列号+1)。
确认号存在的意义就是说我收到你发过来的包啦,赶紧把下一个序列号也发给我吧。
三次握手
为什么会叫三次握手呢?
首先主机A发送一个包给主机B,主机B发回一个确认为第一次握手
主机B发送一个包回主机A,主机A发回一个确认为第二次握手
主机A再发送最后一个确认给主机B,主机B收到确认建立连接第三次握手.
1、 主机A先发送一个32位初始序列号SEQ=x给主机B ,
设置SYN=1表示要建立TCP连接.
2、 主机B收到信息后,如果同意连接,发送一个32位确认号ACK=x+1,然后为自己选择一个32位初始序列号SEQ=y给主机A,
设置SYN=1表示建立TCP连接,再设置ACK=1位表示确认收到连接申请
3、 主机A收到收到主机B的确认后,向B发送序列号SEQ=x+1,确认号ACK=y+1
设置ACK=1位表示确认
最后将进行全双工的通信,全双工就是指可以同一时刻你发信息给我,我也可以发信息给你,不耽误。
这里有一个很重要的问题是:为什么A还要发送一次确认呢?
先假设主机A不用发送确认,那么当互联网中出现丢包现象,主机A发送的连接请求经过很长时间才到达主机B,这个时候主机A已经和主机B由于超时重新连接已经通信过了。但是仍然收到一个连接请求。主机A由于已通信过了,所以不理睬B的确认信号,这个时候主机B将建立连接并长时间白白浪费端口和资源。主机B如果是服务器的话,那么其他客户端根本就没有可以连接的机会了,这是一种灾难。
四次断开
这里我们得先知道TCP连接的一种状态,即半关闭状态,指的是A已经没有数据发给B了,但是B还有数据要发送给A。
所以关闭过程分为两步,先关闭A到B的连接,再关闭B到A的连接。
什么叫四次握手?
这样可能很不严谨,但是为了方便理解
第一次、主机A发送结束请求,停止发送数据,主机B确认
发送FIN=1, 表示A已关闭,请B做好准备
第二次、主机B发送确认信息准备关闭,主机A确认,这时B仍然可以向A发送数据.
发送ACK=1表示B收到了请求
第三次、主机B再发送关闭,主机A再次确认
发送FIN=1,表示我准备关闭了,只要你发送确认我就关闭
第四次、主机A发送确认,主机B关闭连接
发送ACK=1,B关闭连接
更多资料
1、计算机自顶向下
2、计算机网络(谢希仁)
3、TCP/IP详解 卷1
4、图解TCP/IP
5、Computer networks