一、TCP协议
1、建立连接三次握手
【第一次】客户端发送一个带SYN标志的TCP报文到服务器:
- 客户端发出
段1,SYN位
表示连接请求;- 且带序号,序号在网络通讯中用作
临时的地址
,每发一个数据字节,这个序号要加1,便于在接收端
可以根据序号排出数据包
的顺序,也可以发现丢包的情况
;- 规定
SYN位
、FIN位
也要占一个序号,若发了SYN位,则再发送应该用序号加一;mss
表示最大段尺寸
,如果一个段太大
,封装成帧后超过了链路层的最大帧长度
,就必须在IP层分片
,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
【第二次】服务器端回应客户端,带ACK标志和SYN标志。它表示对刚才客户端SYN的回应;同时又发送SYN给客户端,询问客户端是否准备好进行数据通讯。
服务器发出
段2
,也带有SYN位
,同时置ACK位表示确认
,确认序号
,表示"我接收到该序号
及其以前所有的段
,请你下次发送该序号的段",应
答了客户端的连接请求
,同时也给客户端发
出一个连接请求
,同时声明最大尺寸为1024
。
【第三次】客户必须再次回应服务器端一个ACK报文
客户端发出
段3
,对服务器的连接请求进行应答,确认序号
。在这个过程中,客户端和服务器分别给对方发了连接请求
,且应答
了对方的连接请求,其中服务器的请求和应答在一个段中发出,因此一共有三个段用于建立连接,称为【三方握手
】。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值
、最大段尺寸
等。
2、数据传输
【第一次】
客户端发出
段4
,包含从序号1001开始的20个字节数据。
【第二次】
服务器发出
段5
,确认序号为1021,对序号为1001-1020的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送从序号8001开始的10
个字节数据
【第三次】
客户端发出
段6
,对服务器发来的序号为8001-8010的数据表示确认收到
,请求发送序号8011开始的数据。
在数据传输过程中,
ACK
和确认序号
是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区
中,发出数据包给对方之后,只有收到对方应答的ACK段
才知道该数据包确实发到
了对方,可以从发送缓冲区中释放掉了,如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送缓冲区中的数据包重发
。
3、关闭连接四次握手
由于TCP连接是【全双工】的,故每个方向都必须【单独进行关闭【。这原则是当一方完成它的数据发送任务后就
能【发送一个FIN来终止】这个方向的连接。收到一个 FIN只意味着这一方向上【没有数据流动】,一个TCP连接在
收到一个FIN 后【仍能发送数据】。首先进行关闭的一方将执行【主动】关闭,而另一方执行【被动】关闭。
【第一次】
客户端发出
段7
,FIN位
表示关闭
连接的请求。
【第二次】
服务器发出
段8
,应答
客户端的关闭
连接请求。
【第三次】
服务器发出
段9
,其中也包含FIN位
,向客户端发送关闭连接请求
。
【第四次】
客户端发出
段10
,应答服务器的关闭
连接请求。
建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常【不合并在一个段
中】,因为【有连接半关闭】的情况,这种情况下【客户端关闭连接之后就不能再发送数据给服务器了】,但是【服务
器还可以发送数据给客户端】,直到服务器也关闭连接为止。