简单描述TCP请求发送全过程
根据TCP/IP四层模型,数据传输大致流程如下:
应用层
根据用户选择的服务提供对应协议(如:FTP、TELNET、DNS、SMTP、POP3)对数据进行处理。
传输层
通过TCP协议将上游数据进行拆包(避免数据过大造成的性能损耗和对其它数据的实时性造成破坏)、粘包(将几个小的数据合成一个大的数据,提高传输效率)后添加TCP数据报头进行封装。
注:TCP头部内容如下:
-
Source Port/Destination Port 描述的是发送端口号和目标端口号,代表发送数据的应用程序和接收数据的应用程序。比如 80 往往代表 HTTP 服务,22 往往是 SSH 服务…… Sequence Number (序列号)和 Achnowledgment Number (确认号)是保证可靠性的两个关键。 Data Offset 是一个偏移量。这个量存在的原因是 TCP Header 部分的长度是可变的,因此需要一个数值来描述数据从哪个字节开始。 Reserved 是很多协议设计会保留的一个区域,用于日后扩展能力。 URG/ACK/PSH/RST/SYN/FIN 是几个标志位,用于描述 TCP 段的行为。也就是一个 TCP 封包到底是做什么用的? URG 代表这是一个紧急数据,比如远程操作的时候,用户按下了 Ctrl+C,要求终止程序,这种请求需要紧急处理。 ACK 代表响应,之前的文章讲到过,所有的消息都必须有 ACK,这是 TCP 协议确保稳定性的一环 PSH 代表数据推送,也就是在传输数据的意思。 RST 代表复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。 SYN 同步请求,也就是申请握手。 FIN 终止请求,也就是挥手。
网络层
通过IP 协议将上游(体积过大的)数据拆成一个个的封包(Datagram),然后为封包增加 IP 头部,封包发送出去后,就开始进行寻址,其中需要通过ARP(地址解析协议),获得目标地址的MAC地址。寻址就是找到 IP 地址对应的设备。在局域网内,如果找不到设备,就需要路由。路由就是找到数据应该往哪里发送,通过层层路由定位到具体的设备,如果是内外网之间的通讯,需要NAT(网络地址解析协议,通过IP地址+端口的唯一性定位局域网内设备以及对应应用)进行IP转换来找到局域网的设备,在路由过程中,数据最多只能上浮到网络层,只有到达目标设备,才会一直上浮到应用层。
注:IP协议头部内容如下:
-
最重要的是原地址和目标地址。IPv4 的地址是 4 组 8 位的数字,总共是 32 位。 Type Of Service 服务的类型,是为了响应不同的用户诉求,用来选择延迟、吞吐量和丢包率之间的关系。 IHL(Internet Header Length)用来描述 IP 协议头的大小。所以 IP 协议头的大小是可变的。IHL 只有 4 位,最大值 1111 = 15。最大是 15 个双字(15*4 字节 = 60 字节)。 Total Length 定义报文(封包 Datagram)的长度。 Identification(报文的 ID),发送方分配,代表顺序。 Fragment offset 描述要不要分包(拆分),以及如何拆分。 Time To Live 描述封包存活的时间。因此每个 IP 封包发送出去后,就开始销毁倒计时。如果倒计时为 0,就会销毁。比如中间的路由器看到一个 TTL 为 0 的封包,就直接丢弃。 Protocol 是描述上层的协议,比如 TCP = 6,UDP = 17。 Options 代表可选项。 Checksum 用来检验封包的正确性,如果 Checksum 对不上,就需要选择丢弃这个封包。
网络接口层
将上游数据装订成帧,转为光电信号进行发送,每一帧包括数据和必要的控制信息(包括同步信息、地址信息、差错控制信息和流量控制信息等)。该层协议的代表包括SDLC、HDLC、PPP、STP、帧中继等。
上一篇:
Java架构师技术进阶路线图
下一篇:
HTTP常见状态码(14种)