TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。
1. 五层协议体系结构是什么?
OSI 体系结构采用七层协议:由下至上分别是 物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。
TCP/IP 协议的体系结构采用四层协议:由下至上分别是 网络接口层、网络层、运输层、应用层。
所以,我们一般采用五层协议:由下至上分别是 物理层、数据链路层、网络层、运输层、应用层。
五层比较
物理层 | 链路层 | 网络层 | 运输层 | 应用层 | |
---|---|---|---|---|---|
定义的是什么规则 | 相邻计算机节点之间比特流的透明传送 | 两台主机之间的数据传输 | 选择合适的网间路由和交换结点 | 应用进程之间的通信提供数据传输 | 应用进程之间的通信 |
数据单位 | 比特bit(数据位) | 数据帧 | 数据包 | 数据段 | 数据 |
包含的协议 | _ | _ | IP、ICMP、ARP、RARP | TCP、UDP | Telent、FTP |
互联网是由大量的异构网络通过路由器(router)相互连接起来的。
2. UDP协议
UDP (User Datagram Potocol) 用户数据报协议。UDP 提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。UDP协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到。
UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
3. TCP协议
TCP (Transmission Control Procotol) 即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。
协议 / 规则是死的,约束双方的。
那么,TCP面向的连接,到底是什么呢?
3.1 连接是什么?
连接是,双方会在各自服务器的内存里开辟资源(接收队列和发送队列),切换状态。资源和资源之间是对应的,一方的发送根据规则可以到达另一方的接收队列中。
既然TCP是可靠的,什么样子是可靠的呢?
3.2 什么是可靠的?
连接是绝对唯一的。这里,需要说一点socket。
socket 是什么?
-
socket,套接字。套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点。
-
简单的讲,socket 是对资源的包装,资源中包括接收队列和发送队列。所以,通过一对 socket 就可以通信。
-
一个socket = IP + 端口。而通信双方需要2个socket。所以,两个socket = 源IP + 源端口 + 目的IP + 目的端口, 可以表示绝对唯一的连接。也就是说,可以理解为,连接 = 源IP + 源端口 + 目的IP + 目的端口。
另外,端口号有 65535 个。
3.3 TCP如何保证传输可靠?
- 数据被分割。应用数据被分割成TCP认为最适合发送的数据块。
- 编号+排序。TCP 给发送的每个包进行编号,接收方对数据进行排序,把有序数据传送给应用层。
- 校验和。TCP 将保持它首部和数据的校验和。这个校验和是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 会丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- 利用滑动窗口实现流量控制。TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端能够容纳的数据。当接收方来不及处理发送方的数据,会提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
- 拥塞控制。当网络拥塞时,减少数据的发送。
- ARQ (自动重传请求)协议。基本原理是每发完一个分组就停止发送,等待对方确认,在收到确认后再发下一个分组。
- 超时重传。TCP 发出一个段后,会启动一个定时器,等待接收端确认收到这个报文段。如果不能及时收到一个确认,将会重发这个报文段。
4. TCP协议三次握手
建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
4.1 握手过程是什么样子的?
客户端C和服务端S连接的过程如下:
- C 跟 S 说想连接:C -> S 发送 SYN
- S 跟 C 说它知道了:C <- S 发送 SYN + ACK
- C 跟 S 说它收到 S 的消息了:C -> S 发送 ACK
其中,SYN(Synchronize Sequence Numbers) 是同步序列编号,TCP/IP建立连接时使用的握手信号。
ACK(Acknowledge character) 是确认字符,表示发送的数据已确认接收无误。
4.2 为什么要三次握手?
双方确认自己和对方的发送和接收是正常的,从而建立可靠的通信信道。
每次握手,客户端C 和 服务端S 能够确认的信息如下表所示。
客户端C | 服务端S | |
---|---|---|
第一次握手 (C->S) | 什么都不能确认 | 确认对方发送正常; 自己接收正常 |
第二次握手 (S->C) | 自己发送、接收正常; 对方发送、接收正常 | 自己接收正常; 对方发送正常; |
第三次握手 (C->S) | 自己发送、接收正常; 对方发送、接收正常 | 自己发送、接收正常; 对方发送、接收正常 |
4.3 第二次握手传回确认ACK,为什么要传回SYN?
接收端向发送端发送ACK:告诉发送端,我接收到你发送的信号了。表示客户端到服务端的通信时正常的。
接收端向发送端发送SYN:建立并确认从服务端到客户端的通信。
5. TCP协议四次挥手
断开一个TCP连接需要“四次挥手”。断开的是连接,也就是释放资源。
“四次挥手”,指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。断开连接时,可以由任意一方发出请求。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
A和B断开连接的过程如下:
- A 跟 B 说想断开连接:A -> B 发送 FIN
- B 跟 A 说它知道了:A <- B 发送 FIN + ACK
- B 跟A 说它也想端口连接:A <- B 发送 FIN
- A 跟 B 说好,知道了:A -> B 发送 ACK
其中,FIN(Finish) 是,TCP/IP 关闭连接时使用的信号。
ACK(Acknowledge character) 是确认字符,表示发送的数据已确认接收无误。
6. TCP和UDP协议的区别
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 可靠 | 不可靠 |
数据传输形式 | 字节流 | 数据报 |
传输效率 | 慢 | 快 |
需要的资源 | 多 | 少 |
应用场景 | 要求数据通信可靠。一般是文件传输、发送和接收邮件、远程登录等 | 要求通信速度高。一般用于即时通信,比如QQ语音、直播 |
首部字节 | 20-60 | 8个字节 |
参考链接:
https://snailclimb.gitee.io/javaguide/#/docs/network/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C