学习资料
常见面试题
一 TCP/IP Overview
二 数据链路层:以太网
三 网络层
3.1 IP协议
3.2 路由
3.2 IP协议相关技术
DNS(应用层协议)
ARP/RARP
ICMP
NAT
DHCP :动态配置IP地址(应用层协议)
四 传输层
4.1 User Datagram Protocol
4.2 Transmission Control Protocol
4.3 常见问题
五:应用层
5.1 HTTP:超文本传输协议
5.2 Cookie和Session
5.3 HTTPS
5.4 其他应用层协议
学习资料
理解
RFC
-
A TCP/IP Tutorial
介绍了数据从主机A传输到主机B过程中涉及的关键概念,简洁明了,图文并茂。
书籍
- 图解TCP/IP
- TCP/IP详解 卷1:协议 (在线阅读)
常见面试题
一、TCP/IP Overview
- 网络节点的基本结构
The horizontal line at the bottom represents the Ethernet cable; the "o" is the transceiver. The "*" is the IP address and the "@" is the Ethernet address.
-
数据单元的术语
Ethernet frame, IP packet, UDP datagram,TCP segment, and application message。
-
TCP/IP数据包格式
二、数据链路层:以太网
- Ethernet frame 格式
-
MAC地址
6 bytes (AA:BB:CC:DD:EE:FF)
Every device has its own Ethernet address and listens for Ethernet frames with that destination address.
All devices also listen for Ethernet frames with a wild-card destination address of "FF-FF-FF-FF-FF-FF" (in hexadecimal), called a "broadcast" address. -
网络
- 共享介质型网络,共享同一个网络介质,早期使用。
网络控制协议:CSMA/CD 。CSMA/CD means that all devices communicate on a single medium, that only one can transmit at a time, and that they can all receive simultaneously. If 2 devices try to transmit at the same instant, the transmit collision is detected, and both devices wait a random (but short) period before trying to transmit again.
- 共享介质型网络,共享同一个网络介质,早期使用。
-
非共享介质型网络,网络中每个站直连交换机,由交换机负责转发数据帧。
交换机的自学原理:MAC地址和端口的映射。
三、网络层
3.1 IP协议
-
IP 地址
子网掩码、默认网关 10.100.122.2/24
广播地址:10.100.122.255
子网掩码:255.255.255.0 -
IP packet 格式
IP首部20字节
-
IP分片与重组
MTU(最大传输单元)是链路层的概念,指的是一条路径上的允许传输的最大单元的大小。比如以太网的MTU为1500,这意味着以太网中通信的双方能够交互的最大单个报文的大小不能超过1500字节,在IP层由于有20字节的IP头部,则IP载荷不能超过1480。也就是说超过这个大小的IP报文必须经过分段才能够发送。
3.2 路由
-
转发IP数据包
The process of sending an IP packet out onto another network is called "forwarding" an IP packet.
A computer that has been dedicated to the task of forwarding IP packets is called an "IP-router".
As you can see from the figure, the forwarded IP packet never touches the TCP and UDP modules on the IP-router. Some IP-router implementations do not have a TCP or UDP module. -
IP 路由表:IP Module uses this in-memory table to make all decisions about routing an IP packet.
-
IP Module 路由规则
- For an outgoing IP packet, entering IP from an upper layer, IP must decide whether to send the IP packet directly or indirectly, and IP must choose a lower network interface. These choices are made by consulting the route table.
- For an incoming IP packet, entering IP from a lower interface, IP must decide whether to forward the IP packet or pass it to an upper layer. If the IP packet is being forwarded, it is treated as an outgoing IP packet.
These decisions are made before the IP packet is handed to the lower interface and before the ARP table is consulted.
-
IP Module 路由过程
-
路由协议:管理控制路由表
- 外部网关协议BGP:BGP 只能寻找一条比较好的路由,而不是最佳路由。
- 内部网关协议 如何形象说明路由协议RIP和OSPF?
-
RIP:基于距离向量算法。
-
OSPF:基于链路状态算法,基于Dijkstra算法。
-
3.3 IP协议相关技术
DNS(应用层协议)
-
DNS的解析过程:迭代查询+递归查询
浏览器缓存,hosts文件缓存(文件内容:223.1.2.1 alpha),本地DNS服务器 - DNS 原理入门
- DNS为什么既使用TCP又使用UDP?
ARP/RARP
- ARP:根据IP地址获取物理地址
- ARP Table:内存中,每行对应一个IP和Ethernet地址,如:223.1.2.1 08-00-39-00-2F-C3
- ARP 过程
- RARP:根据MAC获取IP地址,功能跟DHCP是一样的。(已经淘汰)
ICMP
- ICMP是(Internet Control Message Protocol)Internet控制报文协议。
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 -
当你「ping 一下」的时候,你知道它背后的逻辑吗?
Ping 最主要的就是检测目标主机的连通性。Ping程序实际就是发送一个ICMP回显请求报文给目的主机,并等待回显的ICMP应答。然后打印出回显的报文。 -
Traceroute Tracert利用ICMP数据报和IP数据报头部中的TTL值。
TTL(Time To Live)是一个IP数据报的生存时间,当每个IP数据报经过路由器的时候都回把TTL值减去1或者减去在路由器中停留的时间,但是大多数数据报在路由器中停留的时间都小于1秒种,因此实际上就是在TTL值减去了1。这样,TTL值就相当于一个路由器的计数器。 当路由器接收到一个TTL为0或者1的IP数据报的时候,路由器就不再转发这个数据了,而直接丢弃,并且发送一个ICMP“超时”信息给源主机。
Tracert程序的关键就是这个回显的ICMP报文的IP报头的信源地址就是这个路由器的IP地址。同时,如果到达了目的主机,我们并不能知道,于是,Tracert还同时发送一个UDP信息给目的主机,并且选择一个很大的值作为UDP的端口,使主机的任何一个应用程序都不使用这个端口。所以,当达到目的主机的时候,UDP模块就产生一个“端口不可到达”的错误,这样就能判断是否是到达目的地了。 -
关于ICMP与TCP的差错控制对比?
比如主机A到主机B的通信,中间Router r1 到Router r2 的网络连接断了。通过ICMP,则可以快速诊断出出错原因,并且报告主机。(差错诊断)
TCP的差错控制,主要是体现在,网络断了,收不到确认回复,TCP会一直再次发送数据包,直到收到确认回复。(差错处理)
NAT
NAT 地址转换DHCP :动态配置IP地址(应用层协议)
- 最前面的"以太网标头",设置发出方(本机)的 MAC 地址和接收方(DHCP 服务器)的 MAC 地址。前者就是本机网卡的 MAC 地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
- 后面的"IP 标头",设置发出方的 IP 地址和接收方的 IP 地址。这时,对于这两者,本机都不知道。于是,发出方的 IP 地址就设为0.0.0.0,接收方的 IP 地址设为 255.255.255.255。
- 最后的"UDP 标头",设置发出方的端口和接收方的端口。这一部分是 DHCP 协议规定好的,发出方是 68 端口,接收方是 67 端口。
四、传输层
4.1 User Datagram Protocol
-
UDP is a connectionless datagram delivery service that does not guarantee delivery.
it merely pushes the datagram out on the net and accepts incoming datagrams off the net. -
UDP datagram 数据格式
UDP首部8个字节。
Checksum
When the UDP module receives the UDP datagram from IP it examines the UDP checksum. If the checksum is zero, it means that checksum was not calculated by the sender and can be ignored.
If the checksum is valid (or zero), the destination port number is examined and if an application is bound to that port, an application message is queued for the application to read. Otherwise the UDP datagram is discarded. -
UDP应用:Network File System (NFS) and Simple Network Management Protocol (SNMP)
-
UDP处理应用数据
1) If the incoming UDP datagrams arrive faster than the application can read them and if the queue fills to a maximum value, UDP datagrams are discarded by UDP. UDP will continue to discard UDP datagrams until there is space in the queue.
2)When an application sends data out through UDP it arrives at the far end as a single unit. For example, if an application does 5 writes to the UDP port, the application at the far end will do 5 reads from the UDP port. Also, the size of each write matches the size of each read.
UDP preserves the message boundary defined by the application. It never joins two application messages together, or divides a single application message into parts.
4.2 Transmission Control Protocol
-
MSS(TCP Maximum Segment Size) 就是TCP数据包每次能够传输的最大数据
MSS存在的本质原因就是TCP和UDP的根本不同:TCP提供稳定的连接。假设生成了很大的TCP报文,经过IP分段进行发送,而其中一个IP分段丢失了,则TCP协议需要重发整个TCP报文,造成了严重的网络性能浪费,而相对的由于UDP无保证的性质,即使丢失了IP分段也不会进行重发。所以说,MSS存在的核心作用,就是避免由于IP层对TCP报文进行分段而导致的性能下降。 -
TCP 字节流
TCP packetizes the byte stream at will; it does not retain the boundaries between writes. For example, if an application does 5 writes to the TCP port, the application at the far end might do 10 reads to get all the data. Or it might get all the data with a single read. There is no correlation between the number and size of writes at one end to the number and size of reads at the other end. -
TCP可靠性
- 通过序列号和确认应答提高可靠性,重传机制;
- 建立连接,三次握手四次挥手
- 滑动窗口
- 流量控制 https://github.com/menggongchang/blog/issues/5#issue-728376790
针对的是发送方和接收方速度不匹配的问题,流量控制是由接收方控制的,发送方始终是被迫调整至与接收方同步。 - 拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复
https://github.com/menggongchang/blog/issues/6
- 流量控制 https://github.com/menggongchang/blog/issues/5#issue-728376790
-
TCP粘包与拆包
针对tcp是字节流协议,问:比如说发送方发了10个包,接收方要怎么知道包的个数呢?- 使用固定长度的消息,报文长度不够的时候用无效数据填充。
- 使用换行字符来分割不同的报文。
- 把消息分为消息头和消息体两个部分,在消息头中添加消息长度的字段。
-
如果要主动关闭连接,如何保证对方已经收到全部数据?
调用shutdown函数,先关闭写半连接,此时仍然保留读连接,直到read 返回0(表明对端已经发起关闭写连接),然后再关闭读半连接。(即下图的客户端)
顺便说一下,close和shutdown的区别。主要有两个:
1. Close把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。而使用shutdown可以不管引用计数就激发TCP的正常连接终止序列。
2. Close终止读和写两个方向的数据传送。但有时候我们需要告知对端我们完成了数据发送,但对端仍有数据要发送给我们,这时就需要使用shutdown。
注意!套接字的半关闭指的是关闭连接的写这一半。
4.3 常见问题
-
TCP与UDP的区别与适用场景
TCP:面向有连接的传输层协议,可以保证通信两端主机之间的通信可达;
可以正确的处理传输过程中丢包、传输乱序等异常情况;还能有效利用带宽,缓解网络拥堵。
UDP:面向无连接的传输层协议,不关注对端是否真的收到传送的数据;
如需检查对端是否收到分组数据包,或对端是否连接到网络,需要在应用程序中实现。
常用于分组数据较少或多播。广播通信及视频通信等领域。 -
TCP、UDP数据包大小的限制
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
UDP 包的大小- 以太网MTU1500字节,1500-20-8 = 1472
- 鉴于 Internet上的标准MTU值为576字节,576-8-20 = 548
-
为什么说TCP报文段是面向字节流的,UDP包是面向数据报的
问题的关键在于TCP是有缓冲区,作为对比,UDP面向报文段是没有缓冲区的。
TCP发送报文时,是将应用层数据写入TCP缓冲区中,然后由TCP协议来控制发送这里面的数据,而发送的状态是按字节流的方式发送的,跟应用层写下来的报文长度没有任何关系,所以说是流。
作为对比的UDP,它没有缓冲区,应用层写的报文数据会直接加包头交给网络层,由网络层负责分片,所以是面向报文段的。
五、应用层
5.1 HTTP:超文本传输协议
-
请求报文和响应报文结构 HTTP学习笔记1:HTTP报文
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
响应报文基本上是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。 -
响应状态码
响应状态码 -
HTTP Keep-Alive
实现HTTP协议长连接、短连接。
短连接在建立连接以后只进行一次数据传输就关闭连接,而长连接在建立连接以后会进行多次数据数据传输直至关闭连接(长连接中关闭连接通过Connection:closed头部字段)。
设置方式:http头加入"Connection: Keep-Alive",具体时间是由服务器来配置。 -
TCP keepalive
如果连接之间没有通信,这个时间窗口会逐渐减小,当它减小到零的时候,TCP协议会向对方发一个带有ACK标志的空数据包(KeepAlive探针),对方在收到ACK包以后,如果连接一切正常,应该回复一个ACK;如果连接出现错误了(例如对方重启了,连接状态丢失),则应当回复一个RST;如果对方没有回复,服务器每隔intvl的时间再发ACK,如果连续probes个包都被无视了,说明连接被断开了。- 检查dead peer
- 阻止因网络连接不活跃(长时间没有数据包)而导致的连接中断,NAT删掉连接;
5.2 Cookie和Session
image5.3 HTTPS
-
- http明文传输不安全;
- HTTP加密,对称加密方式需要安全传输密钥;
- 利用非对称方式传输对称加密的密钥;
- 如何保证客户拿到的网站公钥是正确的,CA证书 = 网站信息+网站公钥+数字签名;
消息摘要 = MD5(网站信息+网站公钥)
数字签名 = CA私钥加密(消息摘要)
-
TCP+HTTPS流程
-
应用
证书,12306 与 https
因为12306 自己给自己发了个证书,而这个证书默认是没有被操作系统信任。
5.4 其他应用层协议
- SMTP:简单邮件协议
- DNS解析
网友评论