物理层,数据链路层,网络层:
https://www.cnblogs.com/flashsun/p/14266148.html#!comments
TCP/IP
https://www.cnblogs.com/flashsun/p/14322660.html
1. TCP 和 UDP
讲解 TCP 三次握手和四次握手之前,我们先了解一下 TCP 和 UDP 这两个重量级的传输层协议。
💦 用户数据报协议 UDP(User Datagram Protocol):
- UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
- 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如:QQ 语音、 QQ 视频 、直播等等
💦 传输控制协议 TCP(Transmission Control Protocol):
- TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
- TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会四次挥手断开连接用来节约系统资源),这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
- TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
三次握手
SYN:同步序列号; ACK :确认字符
有的时候,B 主机的相应进程还没有准备好或是挂掉了,A 就开始发送数据包,导致了浪费。
这个问题在于,A 在跟 B 通信之前,没有事先确认 B 是否已经准备好,就开始发了一连串的信息。就好比你和另一个人打电话,你还没有”喂”一下确认对方有没有在听,你就巴拉巴拉说了一堆。这个问题该怎么解决呢?地球人都知道,三次握手嘛!
A:我准备好了(SYN)
B:我知道了(ACK),我也准备好了(SYN)
A:我知道了(ACK)
四次挥手
A 与 B 各自在内存中维护着自己的状态变量,三次握手之后,双方的状态都变成了连接已建立(ESTABLISHED)。虽然就只是发了三次数据包,并且在各自的内存中维护了状态变量,但这么说总觉得太 low,你看这个过程相当于双方建立连接的过程,于是你灵机一动,就叫它面向连接吧。注意:这个连接是虚拟的,是由 A 和 B 这两个终端共同维护的,在网络中的设备根本就不知道连接这回事儿!但凡事有始就有终,有了建立连接的过程,就要考虑释放连接的过程,又是地球人都知道,四次挥手嘛!
A:再见,我要关闭了(FIN)
B:我知道了(ACK)
给 B 一段时间把自己的事情处理完…
B:再见,我要关闭了(FIN)
A:我知道了(ACK)
TCP 协议头解读的图

