TCP协议:
TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。
面向连接:数据传输之前客户端和服务器端必须建立连接。
可靠的:数据传输是有序的 要对数据进行校验。
而其协议之所以可靠是因为其有一套完整的断开连接机制来保证数据传输的安全性和稳定性。这个机制在中文社区被生动形象的称之为三次握手四次挥手。这是对连接与断开的情形做了优化。
三次握手
名词解析:
SYN |
同步位 |
ACK |
确认位 |
ack |
确认号 |
swq |
序列号 |
当客户端A想要与服务端B建立连接时,其过程如下:
A生成一串序列号Seq(随机x)和一个同步位SYN(连接请求)到服务端B,B在接收到其同步请求(连接请求)后,会生成确认位ACK=1(执行)和确认号ack=x+1来向客户端表示:同意A生成的序列号为x的连接请求,我的同意的确认号ack=x+1,同时B生成一个序列号Syn=y,且把SYN=1返还。在A收到B的答复之后,A会重新生成确认表示已经收到,等新的确认号=y+1到达B之后则AB建立连接。
为什么不两次握手便直接连接?
下面情形:假设a网络状况并不良好,在发出请求后到达B, D已经收到了其请求并给予了答复但是A由于网络问题迟迟未能收到答复此时A'主机端口重新发送一条请求,且此时回复到达。则必会重新在生成一条请求但由于在生成一条请求之前A已经收到了答复,则AB在会在已经建立连接的情况下重新建立连接那么AB就不同步了。
其恒类似与下面生活情形
三次:
A:我8点来,你有空?
B:我7点到11点有空,你来吧。
A:OK,我知道你什么有空了,我到了!你开门。
而两次则是:
A:我8点来,你有空?
B:我7点到11点有空,你来吧。
A:我9点来你有空?
那么这个时候后者就要纳闷他到底几点来?
三次握手机制有效地避免了请求与确认的滞后性保证了数据传输的双向与及时,并且由于其协议本身就包含对于包的分割与确认可以导致数据的传输中不遗漏不错误。
四次挥手
FIN |
断开值 |
ACK |
确认位 |
ack |
确认号 |
swq |
序列号 |
而断开与连接类似只是交互次数变成了四次,其过程如下:
A生成断开请求并生成随机数列u B收到A的请求加以确认生成确认值以及新的随机数v并基于确认值ack=u+1。此时连接半关闭即b可转a不可,之前是二者皆可。之后b重复操作到a返回确认,二者断开。那么这样做的好处是什么呢?可以避免一些莫名其妙的断开情况。
为什么客户端要等待2MSL?
主要原因是为了保证客户端发送那个的第一个ACK报文能到到服务器,因为这个ACK报文可能丢失,并且2MSL是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃,这样新的连接中不会出现旧连接的请求报文。