【计网】TCP
Dandelion 7/12/2022 network
# 概述
# TCP 基本认识
- TCP 头部:源端口号,目标端口号,序列号,确认应答号,首部长度,控制位,窗口大小,校验和,紧急指针,选项(可变长),数据。
- 序列号:解决网络包乱序问题。建立连接时,随机生成初始值,通过 SYN 包传给接收方,每次对数据字节数的大小进行累加。(序列号能够保证数据包不重复、不丢弃和按序传输。)
- 确认应答号:解决丢包的问题。发送方收到这个确认应答后可认为在这个序号以前的数据都已经被正常接收。
控制位
:URG,ACK(应答确认)
,PSH,RST(连接异常需断开)
,SYN(希望建立连接)
,FIN(希望断开连接)
- TCP 协议:面向连接的、可靠的、基于字节流的传输层通信协议。
- IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。
- TCP 是一个工作在传输层的进行可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
面向连接
:一定是一对一的连接。无法做到像 UDP 一样可以一个主机同时向多个主机发送消息。可靠的
:无论网络链路如何变化,TCP 可以保证报文必能到达接收方。基于字节流
:报文分组,自动去重,报文有序、完整集成。从而保证应用层最终收到的是完整的消息。
- TCP 连接
- 用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
- 建立一个 TCP 连接,需要客户端与服务器端达成以下三个信息的共识:
- Socket,由 IP 地址和端口号组成;序列号,用来解决乱序问题等;窗口大小,用来做流量控制。
- 确定唯一 TCP 连接:
< 源 IP,源端口,目标 IP,目标端口 >
- 服务器的最大 TCP 连接数(监听一个端口,受文件描述符和内存限制):
客户端的 IP 数 * 客户端的端口数
- UDP vs TCP
- UDP 头部:源端口号,目标端口号,包长度(首部和数据长度之和),校验和,数据。
TCP 数据的长度 = IP 总长度 - IP 首部长度 - TCP 首部长度
- TCP 和 UDP 的区别:
区别 TCP UDP 连接 传输数据前先要建立连接 无需建立连接,即刻传输 服务对象 一对一的两点传输 支持一对一、一对多、多对多的通信 可靠性 可靠传输,数据可以无差错、不丢失、不重复、按需到达 尽最大努力交付,不保证可靠交付数据 传输控制 通过拥塞控制和流量控制机制,保证数据传输的安全性 即使网络非常拥堵,也不会影响发送速率 首部开销 没有选项字段时,是 20 个字节;选项字段长度是可变的 固定大小,8 个字节 传输方式 流式传输,没有边界,但保证顺序和可靠 逐包发送,有边界,但可能会丢包和乱序 应用场景 FTP 文件传输,HTTP/HTTPS 包总量较少的通信,如 DNS 等;视频、音频等多媒体通信;广播通信
# TCP 连接建立
- TCP 三次握手
- 一开始,客户端和服务端都处于
CLOSED
状态。服务器主动监听某个端口,处于LISTEN
状态。 - 客户端发起连接,随机初始化序列号
x
,将 SYN 置为 1,然后发送 SYN 报文给服务端,之后客户端处于SYN-SENT
状态。 - 服务端收到后,随机初始化序列号
y
,确认应答号字段填入x+1
,将 ACK 和 SYN 都置为 1,最后将报文发送给客户端,之后服务端处于SYN-RCVD
状态。 - 客户端收到后,将 ACK 置为 1,确认应答号字段填入
y+1
,最后将应答报文发送给服务端,之后客户端处于ESTABLISHED
状态。 - 服务端收到最后的应答报文后,也进入
ESTABLISHED
状态。注:第三个报文(即第三次握手)可以携带数据,前两个不可以携带数据。
- 一开始,客户端和服务端都处于
- 查看 TCP 的连接状态:
netstat -napt
- 三次握手才能建立连接的原因:保证双方具有接收和发送的能力(太片面)。
- 相当于:为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接?
- 可以防止异常的历史连接进行初始化(主要);可以保证双方的初始序列号都能被确认接收;可以避免重复接收无用的连接请求,造成资源浪费。