看过太多tcp相关文章,但是看完总是不过瘾,似懂非懂,反复考虑过后,我觉得是那些文章太过理论,看起来没有体感,所以吸收不了。 希望这篇文章能做到言简意赅,帮助大家透过案例来理解原理。
tcp的特点这个大家基本都能说几句,面试的时候候选人也肯定会告诉你这些:
但是我只希望大家记住一个核心的:tcp是可以可靠传输协议,它的所有特点都为这个可靠传输服务。
那么tcp是怎么样来保障可靠传输呢?tcp在传输过程中都有一个ack,接收方通过ack告诉发送方收到那些包了。这样发送方能知道有没有丢包,进而确定重传。
tcp建连接的三次握手来看一个java代码连接数据库的三次握手过程
image.png
三个红框表示建立连接的三次握手:
- 第一步:client 发送 syn 到server 发起握手;
- 第二步:server 收到 syn后回复syn+ack给client;
- 第三步:client 收到syn+ack后,回复server一个ack表示收到了server的syn+ack(此时client的48287端口的连接已经是established)
握手的核心目的是告知对方seq(绿框是client的初始seq,蓝色框是server 的初始seq),对方回复ack(收到的seq+包的大小),这样发送端就知道有没有丢包了。
握手的次要目的是告知和协商一些信息,图中黄框。
- MSS–最大传输包
- SACK_PERM–是否支持Selective ack(用户优化重传效率)
- WS–窗口计算指数(有点复杂的话先不用管)
这就是tcp为什么要握手建立连接,就是为了解决tcp的可靠传输。
tcp断开连接的四次挥手再来看java连上mysql后,执行了一个SQL: select sleep(2); 然后就断开了连接
image.png
四个红框表示断开连接的四次挥手:
- 第一步: client主动发送fin包给server
- 第二步: server回复ack(对应第一步fin包的ack)给client,表示server知道client要断开了
- 第三步: server发送fin包给client,表示server也可以断开了
- 第四部: client回复ack给server,表示既然双发都发送fin包表示断开,那么就真的断开吧
|