TCP
TCP全名传输控制协议,就理解是个双方通讯必须遵守的规范得了。也是在TCP五层模型中的传输层。
TCP头部报文
讲握手之前先看下头部报文结构:
图片来源----《小鹿动画学编程》
- source port:源端口号,指本地端口。例如你电脑上每个程序的端口号。
- distination port:目的端口号,指远程端口。例如你电脑QQ程序所对应的服务器端口。
- Sequence Number:序列号。一个数据包在被发送时会分成多个数据段,通过序列号能保证数据段的顺序。
- Acknowledgment Number:确认序列号,就是每个数据段都有一个序号,该数据段的下个序号就是确认序列号,就是要确认之前的数据段都送达了,记录丢包情况。
- UAPRSF:统称TCP Flag,用来记录TCP状态,分为URG,ACK,PSH,RST,SYN,FIN。
- Window size:滑动窗口大小,用来进行流量控制。
ACK
三次握手中的常客,学名应答域有效。我们不整这种高端的,ACK=0表示请求,ACK=1表示收到你呃请求了。比如浏览器发送ACK=0,服务器收到了,响应回一个ACK=1给浏览器表示我收到你的请求了。
SYN
三次握手中的常客,学名同步序列号。不整高端的就表示需要建立TCP连接,放在第一次请求中,一般发送SYN=1来表示。
FIN
用来表明断开连接,没数据发了。
三次握手的过程
-
第一次握手:浏览器的请求报文中SYN=1,加上自己的初始序号x给服务端,表示需要建立链接;
-
第二次握手:服务器返回ACK=1,SYN=1,确认序列号为ack=x+1,再加上自己的初始序号y;
-
第三次握手:客户端接收到后发送ack=y+1,表示已连接;
三次握手的作用
- 为了确认双方的接收与发送能力是否正常。
- 如果没有三次握手,会出现浏览器发送连接请求,延迟到达服务器后称为一个无效请求(请求太久了浏览器已经在做其他连接操作了),服务器苦苦等待浏览器发数据(等待戈多),造成服务器的资源浪费。
- 如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成。
四次挥手的过程
见面最后都有告别的时候,双方通过四次挥手来断开连接。
-
第一次挥手:浏览器发送请求报文中FIN表明断开连接,加上序列号u(等于前面已经传送过来的数据的最后一个字节的序号加1);
-
第二次挥手:服务器收到了,返回ACK=1,确认序列号为ack=u+1;
-
第三次挥手:服务器也含泪发送FIN表明断开连接加上序列号w(由于二次和三次挥手之间可能服务器还有数据传输,所以为了保证顺序在最后个数据的字节序号加1);
-
第四次挥手:浏览器收到了,返回ACK=1,确认序列号为ack=w+1;
补充
扩展:应用程序的端口号和应用程序所在主机的 IP 地址统称为 socket(套接字),IP:端口号, 在互联网上 socket 唯一标识每一个应用程序,源端口+源IP+目的端口+目的IP称为”套接字对“,一对套接字就是一个连接,一个客户端与服务器之间的连接。----《小鹿动画学编程》
减少记忆负担
为了减少记忆负担,我就用通俗的话来形象说明三次握手和四次挥手的意思吧,面试这题拿个及格就行。
可以看成是浏览器和服务器的开头对话和结尾。
三次握手:
浏览器:在吗?
服务器:在。
浏览器:等下有事找你。
HTTPS过程:
浏览器:巴拉巴拉…
服务器:巴拉巴拉…
浏览器:巴拉巴拉…
…
四次挥手:
浏览器:不聊了
服务器:好
服务器:我也没啥和你说的了
浏览器:好
尾巴
这篇文章本意是想写细致一些,但由于我收集的几个文章有出现表述不明确,前后有矛盾的问题,于是我就用简写加不严谨的方式记录了。