首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

TCP传输(1)

TCP传输(1)

看过太多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包表示断开,那么就真的断开吧
返回列表