TCP协议详细介绍:
TCP |
有连接 |
可靠连接 |
面向字节流 |
全双工 |
先给你们看一个TCP协议的报文格式~~它有点大,我就这样画出来了~不然是一整行
来让我解释一番~~~but, 这要结合TCP的特性啦!!!-------可靠性传输
32位序号,32位确认序号 |
1.确认应答 |
|
4位首部长度, 保留(6位) |
|
|
6个特殊标志位 |
URG, ACK, PSH, RST, SYN, FIN |
分布其中 |
16位窗口大小 |
5.流量控制 |
|
16位校验和 |
与UDP同 |
|
16位紧急指针 |
与URG相关 不细说 |
TCP最最最重要的特性-可靠性传输!
Okk, 问题来了 什么算可靠传输?
数据顺利达到对方, 对方给了响应~~~
这其实专业一丢丢叫: 1.确认应答2.超时重传3.连接管理4.滑动窗口(效率)5.流量控制6.拥塞控制7.延时应答(效率)8.捎带应答(效率)9.面向字节流(注意事项)10.异常处理(可靠性的延伸) --- 别怕 这只是TCP冰山一角的十个特性而已
小明知道小芳看到了消息~~~1.确认应答
举栗子1~~~~讲ACK
小明 |
小芳 |
芳芳~~晚上要一起吃南方菜嘛 |
|
我去接你~ |
|
好啊~~ |
|
不要~~我和同事一起 |
你看! 小明请吃饭, 那他怎么知道,小芳答应了他 -> 小芳回复他咯~~
好~上专业芝士
举栗子2~~~~讲32位序号, 32位确认序号
小明 |
小芳 |
芳芳~~晚上要一起吃南方菜嘛 |
|
我去接你~ |
|
不要~~我和同事一起 |
|
好啊~~ |
呐呐呐~这就是另一种含义啦,小明,小芳的感情!!!! 会不会受到冲击呢~~~不会,因为这是可靠传输!!!!! 我们有 32位确认序号 简单来说 不如看图~~
小明 |
小芳 |
芳芳~~晚上要一起吃南方菜嘛 (1) |
|
我去接你~ (2) |
|
不要~~我和同事一起 (2) |
|
好啊~~ (1) |
好~上专业芝士
小明的消息没发过去~~~2.超时重传
举栗子1~~~~
呐呐呐 如果更惨呢,小芳根本没收到小明的消息
两种情况
1.小明的话没发过去
小明 |
小芳 |
芳芳~~晚上要一起吃南方菜嘛 |
|
我去接你~ |
2.小芳的话没发过去
小明 |
小芳 |
芳芳~~晚上要一起吃南方菜嘛 |
|
我去接你~ |
|
不要~~我和同事一起 |
|
好啊~~ |
好~上专业芝士
小明和小芳能互相(不)发消息~~3.连接管理
举栗子1~~~~建立连接~~(小明&小芳建立一个相互认同的关系)
咱们就结合故事与芝士看这个part
三次握手
好叭~还是需要补充亿点芝士:
举栗子2~~~~断开连接~~(小明&小芳取消相互认同的关系)(oh my god 我磕的cp掰了)(呜呜呜)(他们还能旧情复燃吗?)(这会是偶像剧的烂俗情节吗?不知道哎)
四次挥手
哎 很悲伤的四次挥手,那我们 先学点芝士吧~~
建立连接和断开连接都看完了, 思考一下, 为什么三回握手能合并, 四次挥手不能???
三次握手: 小芳给小明发的 SYN ACK 都是内核触发的, 也就是立即发送
四次挥手: ACK是内核触发的, 但是 FIN 是应用程序显示调用socket的close方法触发的
提高效率的小明~~~4.滑动窗口
继续走故事~~
小明终于醒悟了, 他前女友小丽,虽然离婚了, 但是已经怀孕了, 她甚至还爱着那个男人~~(呜呜呜,为什么当初和小芳分手啊,这男人,可恶!)~~~他发现,他喜欢小芳的, 于是, 他和小丽断干净了关系, 去找小芳, 但是小芳不见他, 他就发消息, 他之前发一条消息, 小芳很快就回一条, 但是现在, 小芳对他爱答不理, 总不回消息, 于是 小明, 连环夺命发~~~~~
没收到小芳消息, 他也发, 就是发发发~~~(我压岁钱也能被这样就好了~)~~
来学芝士:
传的数据丢了 |
丢了数据报A却不知道,但是B回一直回复ACK索要丢的数据, A知道后会重发,只把丢了的重传就行(因为之后的数据报A发了,B也收到了~) --谁丢传谁 –“快速重传” |
ACK丢了 |
部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认, 因为后者包含前者 (比如 它回下一个是3001, 所以下一个是2001丢了也无所谓, 因为它能回下一个是3001, 就说明之前的都接收到了~~) |
不能光走效率,还要考虑一下小芳心情~~~5.流量控制
小明要是这么发, 那就babiq了, 本来就烦,还狂发??? 所以, 要做出限制, 可以发, 但是不要那么那么多~~~
他俩现在感情不好~不让我讲细节~咱们继续学芝士:
流量窗口就是在滑动窗口的基础上做出限制~~~限制发送方的窗口大小不要太大(小明发的信息不要太多)
问题来了,窗口大小多少合适? -- 问问接收方,看接收方觉得多少合适 (咳咳,我也不知道小明是最后怎么知道的,所以后续细节请自行脑部, 这是来自小芳的反制, 小明加油! 小心一步踏错, 万丈深渊)
那接收方的接收速率,如何进行量化? – 接收方使用接收缓冲区的剩余空间的大小, 来作为发送方发送速率(窗口大小)的参考值
16位窗口大小: 接收缓冲区剩余空间大小的值, (ACK为1的时候(应答报文)才有意义) ~~看下面的图, 窗口大小其实是动态变化的~~很聪明,很巧妙
当他俩的故事是一个场景,而你们看故事是另一个场景, 那么,请考虑一下我作为中间人的心情叭,我给你们传递他俩消息~我我我,我的效率也考虑考虑呗, 一个故事N条芝士,芝士片,芝士碎~~顶不住啊~~~~6.拥塞控制
简单来说,我更新效率高! 给你们讲故事就多, 那我卡bug了, 咱们就有缘再见了~~
来用专业一点的话说:--oh 芝士
7.延时应答
哈哈哈哈,没故事,直接看芝士吧~
8.捎带应答
基于延时应答
应答+ACK 合二为一 内核处理的,应用程序调用的 socket的write方法把数据交给内核, 内核进行封装, 在发送 ---- 看不懂! 来 让我调出小明小芳聊天记录给你讲讲~~
9.面向字节流
这里存在一个典型问题 --- ''粘包问题'' ,那我们还是看故事
小明: ”我真的确认, 我现在走出来了, 所以, 能在给我一次机会吗? 我会……”
小芳:” 嗯,我需要思考一段时间”
呐呐呐,如果, 现在场景是, 我们不知道小芳句子的结束在哪里 是嗯 还是 时间, 如果只给小明传递了 嗯 好的babiq了~~~这对cp必be了
所以, 我们有别的机制来, 让他们的爱情❤不因为这个be
芝士!快学!别让磕的cp be掉~
1. 通过分隔符, 比如约定使用 ; 作为包的结束标记 |
2. 通过指定包的长度, 比如在数据包的开头位置声明长度 |
10.异常处理
这这这,直接看吧~~就 自我理解一下
i)程序崩溃了 |
进程异常退出 |
操作系统会回收进程的资源, 包括释放文件描述符表, 这样的释放操作, 就相当于调用了对应的socket的close, 执行close就会触发FIN报文, 进一步开始四次挥手 |
ii)正常关机 |
通过菜单这种方式来关闭主机 和程序崩溃差不多 |
关机的时候, 系统会先强制结束所有的用户进程, 和上述的那个进程崩溃类似, 系统内核, 会进行文件描述符的释放操作, 进一步进行四次挥手 |
iii)主机掉电 |
非常突然, 猝不及防 |
1,掉电的是接收方, 发送方是不知道对面挂了, 继续发数据 -> 此时发的数据, 没有ACK了, 发送方触发超时重传, 重传几次之后, 仍然无应答, 尝试重置连接(复位报文段RST), 也会失败, 只能 ->放弃连接 2.掉电的是发送方, 此时接收方就等着 -> 接收方也不是干等, 等了一阵之后, 就会发送一个 ''心跳包'' 心跳包是周期性触发的, 只是一个简单的不携带任何业务数据的包, 存在的意义就是确认一下对方是否还在, 如果对方不返回心跳包, 说明心跳遗失了. 对方挂了 -> 放弃连接 |
iv)网线断开 |
情况同主机掉电 |
只不过通信双方的主机都好着, 这两端各自按照上述的两种情况分别进行 |
恭喜恭喜, 你看完了~我更完了~我们都很棒~嘿嘿嘿 冲!~~