TCP-IP协议
最后更新于:2022-04-02 04:31:18
## TCP-IP协议
**author:xiak**
**last update: 2021-11-25 11:22:33**
----
[TOC=3,8]
> 我们上层应用写的飞起,但总是出现奇怪的问题都是一脸懵,基础知识非常缺乏,尤其是做php和前端的,可能连tcp是什么都说不清楚
> 因为应用开发基本接触不到这些,都是给你封装好了,天高皇帝远,只知世间有 http 不知有 tcp
> 我对 QUIC 大规模应用将会提高网络效率的论调持怀疑态度,TCP/IP 已经历了几十年的验证和修正,早已被验证过是稳定可靠的,可能我是过于保守了,但是不要忘了 tcp 协议的精髓是它的自治策略,在网络不稳定时它会牺牲个体的传输从而使整个网络更加稳定,而 QUIC 不是这样的,我不知道这种激进的策略在大规模网络下会出现什么问题,一切有待验证,并且新协议的推广和普及也不是一两天就可以做到的,即使被证明是有效的,也会在很长很长的时间内两者共同存在。
----
### OSI七层网络模型 / TCP/IP四层概念模型
~~~
5- Session 会话层 / 6- Presentation 表示层 7- Application 应用层
↑↓ Binary byte: 应用数据: app首部 + 用户数据 (这只是为了界定业务数据的边界,粘包问题)
#4 Transport 传输层 (tcp传输协议,port号)
↑↓ Segment - TCP段: tcp首部 + 应用数据
#3 Network 网络层 (ip地址)
↑↓ Datagram - IP数据报 (Packet - IP数据包分组): ip首部 + TCP段
Datagram: Packet{1, +} (fragment 分片)
#2 Data Link 数据链路层 (网卡mac地址)
↑↓ Frame - 以太网帧: 以太网首部 + IP数据包 + 以太网尾部
length: 46 ~ 1500
#1 物理层
↑↓ photon 光子
~~~
----
### Wireshark 常用过滤规则
(源:数据发送方,目标:数据接收方)
数据链路层: 源mac地址 目标mac地址
网络层: 源ip 目标ip
传输层: tcp/udp 源端口 目标端口
应用协议层: http 请求/响应 头字段/内容
(响应是应用层的概念,对上层来说 其实是一次数据发送)
----
### 七层网络模型 / 四层概念模型
----
### 扩展
[TCP 的那些事儿(上) | 酷 壳 - CoolShell](https://coolshell.cn/articles/11564.html)
[TCP 的那些事儿(下) | 酷 壳 - CoolShell](https://coolshell.cn/articles/11609.html)
> 但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,**小则让自己的连接更稳定,大则让整个网络更稳定。**
> TCP的设计者觉得,一个伟大而牛逼的协议仅仅做到流控并不够,因为流控只是网络模型4层以上的事,TCP的还应该更聪明地知道整个网络上的事。
[TCP/IP四层模型和OSI七层模型_whmnirvana的博客-CSDN博客](https://blog.csdn.net/whmnirvana/article/details/76985001)
[【工具-WireShark】网络HTTP抓包使用教程_Ric的博客-CSDN博客](https://lichong.blog.csdn.net/article/details/120820845)
[通俗易懂TCP/IP(概述)](https://baijiahao.baidu.com/s?id=1679150230832085964&wfr=spider&for=pc)
> 大物理学家费曼提出一个高效的费曼学习法,**即从问题入手,试着把问题都讲出来**,以教代学,**一旦你能把问题都讲清楚,便学会了。**
[搞了半天,终于弄懂了TCP Socket数据的接收和发送,太难](http://www.360doc.com/content/20/0812/23/36242867_930032487.shtml)
> 另一个反对排队的论点是,它使应用程序在连接的另一端(客户机)看起来很慢。客户机将看到它可以建立新的TCP连接,但是当它尝试使用它们时,服务器似乎响应非常慢。所以建议在这种情况下,最好是让新的连接失败,因为这样可以提供更明显的服务器不正常的反馈。
> 当用户态的进程实际调用文件描述符上的read(2)时,它会导致内核从其接收缓冲区中删除数据,并将该数据复制到此进程调用read(2)所提供的缓冲区中。
>
> **接收读取时直接删除 read buffer 而不用等到 ack确认 发送完毕(ack本身也不需要再ack了啊),发送时 要等到 对方 ack 确认 到达才会删除 write buffer** 。
> 读语义:如果接收缓冲区已满,而TCP连接的另一端尝试发送更多的数据,内核将拒绝对数据包进行ACK。这只是常规的TCP拥塞控制。
> 写语义:如果写入队列已满,并且用户调用写入write(2)),则系统调用将被阻塞。
> 接收方 read buffer 满(说明应用程序处理能力过载),**不再接受数据, 不 ack 了,那么 发送方 write buffer 很快也就满了(等不到 ack 就不删除 write buffer)**,不能再发了。这算是一种 常规的TCP拥塞控制。
>
> **发送能力会取决于对对方的接收能力,网络能相互自适应调节**,网络整体是自治的,最终整个网络会向健康的方向发展,通信效率趋于最大化,这是 tcp协议的魅力所在。这就像是交通一样,只要有秩序,就能减少拥堵,畅通无阻,都能平安到家。
';
OSI七层网络模型 | Linux TCP/IP四层概念模型 | 对应网络协议 |
应用层(Application) | 应用层 | TFTP, FTP, NFS, WAIS |
表示层(Presentation) | Telnet, Rlogin, SNMP, Gopher | |
会话层(Session) | SMTP, DNS | |
传输层(Transport) | 传输层 | TCP, UDP |
网络层(Network) | 网际层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 网络接口 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | IEEE 802.1A, IEEE 802.2到IEEE 802.11 |