如果之前要是遇到TCP三次握手的问题
我的回答会是这样:
客户端发起一个连接请求,服务端应答,客户端收到应答后再发送请求给服务端。
但这样明显没答到点上,不知道每次请求应答里面携带的报文内容是什么?
又或是知道SYN、ACK,但每次请求的SYN、ACK是什么?
又为什么TCP握手不是两次、不是四次,而是三次?
奈何大学专业不是计算机,所以之前没接触,只能边搬砖边学习了。
基于这些问题,我读了《TCP/IP详解:卷1》,现在在公众号上分享一下我的笔记。
如有错,麻烦指正,谢谢!!!
TCP/IP概述
分层
网络协议通常分不同的层次进行开发,分别负责不同的通信功能。
TCP/IP通常被认为是一个四层协议系统,
分层 | 作用 | 例子 |
---|---|---|
应用层 | 处理应用程序细节 | Telnet、FTP、SMTP、SNMP |
传输层 | 为不同主机的应用程序提供端到端的通信 | TCP、UDP |
网络层 | 处理分组在网络中的活动,例如分组的选路 | IP、ICMP、IGMP |
链路层 | 处理与传输媒介(比如电缆)的物理接口细节 | 设备驱动程序和接口卡 |
「作为一个非底层架构开发人员,只需要关注传输层和网络层即可」
- TCP(传输控制协议) 提供高可靠性的数据通信,把数据进行分包交给网络层
- UDP(用户数据包协议) 不可靠协议,把数据包分组从一台主机发往另一台主机,不保证数据报能送达
假设在一个局域网内有两台主机都运行FTP协议,那么它们各层的协议如下:
网络层IP提供的是一种不可靠的服务。也就是说,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。
TCP在不可靠的IP层上提供了一个可靠的运输层。为了提供这种可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组、拥塞控制等机制。
「TCP与UDP的区别」
- TCP是可靠的,为什么可靠,因为其提供了按序发送并确认、超时重传、发送确认、拥塞控制、流量控制等机制
- TCP是面向连接的(传输之前要进行三次握手),而UDP不是
- TCP有状态,UDP无状态
- UDP是不可靠的
TCP/IP的分层
TCP和UDP是两种最为著名的运输层协议
二者都使用IP作为网络层协议
TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。
ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
互联网的地址
互联网的每一个接口都必须有一个唯一的Internet地址(IP地址),IP地址长度为32bit
类型 | 范围 |
---|---|
A | 0.0.0.0 ~ 127.255.255.255 |
B | 128.0.0.0 ~ 191.255.255.255 |
C | 192.0.0.0 ~ 223.255.255.255 |
D | 224.0.0.0 ~ 239.255.255.255 |
E | 240.0.0.0 ~ 255.255.255.255 |
有三类IP地址:
- 单播地址(单个主机)
- 广播地址(给定网络上的所有主机)
- 多播地址(同一组内的所有主机)
域名系统
在TCP/IP领域中,域名系统(DNS)是一个分布式数据库,由它来提供IP地址和主机名之间的映射关系。
封装
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当做一串比特流送入网络,每一层收到的数据都要增加一些首部信息。
TCP传给IP的数据单元称作TCP报文段或简称为TCP段,IP传给网络接口层的数据单元被称作IP数据报,通过以太网传输的比特流被称作帧。
UDP数据和TCP数据基本一致,不同的是UDP传给IP的信息单元被称作UDP数据报,UDP的首部长是8字节。
IP首部有个8bit的数值称为协议域,标志数据属于哪一层。1标识ICMP,2标识IGMP,6标识TCP,17标识UDP。
以太网数据帧的物理特性是其长度必须在46~1500字节之间。
例如:一个HTTP请求数据报封装流程是这样的
分用
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称为“分用”。
HTTP从请求到应答的历程
从上一节的封装和分用,已经大概能推测出从浏览器发起HTTP请求到应答的整体流程了,接下来就用一个图片来详细看一下。
「收到网络数据报的处理流程:」
当一个网络包从一个网口经过的时候,首先看看要不要进行处理。有些网口配置了混杂模式,凡是经过的,全部都需要进行处理。
拿到网络数据包之后,先从buffer中摘掉MAC
如果MAC地址和当前MAC相符,说明是发给本机的,于是摘掉IP,看看到底是发给本机的还是希望从本机转发出去的。
如果IP地址不是本机,就应该转发出去。如果IP地址是本机的,就是发给自己的。
根据IP头里面的标示,拿掉三层的头,进行下一层的处理,判断到底是TCP还是UDP。
假设是TCP,此时Buffer里面没有三层的头,需要查看四层的头,判断是发起还是应答,又或是一个正常的数据报,然后分别处理不同的逻辑。如果是发起或应答,就可能要发送一个回复包;如果是一个正常的数据包,就需要较给上层应用处理。
交给哪个应用?在四层的头里有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听此端口,那就发给浏览器。