|
首先我们要知道TCP的特性:
1.tcp传输是需要建立连接的
2.tcp可以同时进行数据双向的传输,也叫做双同工模式
3.tcp可以保证数据的完整性
4.tcp是进程到进程中可靠的通信协议
5.数据的传输是有序进行的
接下来我们要知道tcp头部中有什么:
第一层是源端口号和目标端口号,这个都是16位的数据,总共为32位
第二层呢就是序列号,用来给每一段的数据进行排列,因为TCP是进行有序收发的
第三层呢就是确认号,用来双方建立连接时使用的,是随机生成的,也是32位的
第四层就是首部四位加保留六位加6位的控制位;再加上一个窗口大小
第五层就是校验和16位和紧急避针16位
第六层就是还有一个选项位,其实一般包含mms和exp值,mms是协商的传输数据长度,exp是期望值
接下来就详细讲建立连接中控制位的详细作用了
首先控制位有URG ACK PSH RST SYN FIN 这六个,分别表示紧急,知道,推出,复位,同步,终止
1.在进行链接的时候首先客户终端向服务终端发送syn报文同步请求,其中包含了自己随机生成的确认号seq=x,在选项段中有自己的期望值exp=x+1。此时客户端的状态是connect(),服务器端的状态是listen的状态。
2.当服务器收到信号后从listen状态变成了RCVD_SYN的状态,然后回复客户端ACK和SYN的复合报文ACK 的数据为x+1在选项段中,syn的随机序列号seq为y,期望值y+1也在选项段中,此时表示服务器已经收到客户端的请求,并且同时期望于客户端建立连接;
3.当客户端收到了服务器的报文后自己将进入连接状态 ESTABLELISHED,同时还需要给服务器回复一个ACK旗标位为1的报文ACK=Y+1表示自己收到连接请求,服务器收到以后服务器也进入连接状态,此时双方成功建立连接
有同学会问为什么两次不可以呢:
因为建立连接我们要同时知道对方和我自己的收发能力都正常才可以。可以看着图想一下,第一次握手的时候是不是客户端知道了自己的发送能力正常,服务器知道了自己的收的能力正常和客户端的发送能力正常;
第二次握手服务器知道了自己的发送能力正常,客户端知道了自己的收的能力也正常了。好的这里我们先来捋一下,现在客户端知道了自己的收发正常了,知道服务端的收发正常了吧;服务端知道了客户端的发送能力和自己的收发能力正常,是不是少了一个,那就是服务端不知道客户端的收的能力
所以还需要最后一次握手告诉服务器客户端的收的能力也正常,就此正式进入连接;
同时一个小补充,第三次握手的时候是可以携带数据的。 |
|