这几天看了TCP/IP的相关知识,感觉要系统的整理很难,一段一段的整又容易乱,最后想到用解决问题的方式来整理。
这里有一点基本概念和模型图TCP/IP协议基本知识
问题:
- 1.TCP/IP,ICMP,ARP,FTP,DNS,DHCP,MTU这些,分别是什么?
- 2.TCP 和 UDP的区别及用途?
- 3.端口和服务间的关系及常用端口?
- 4.TCP三次握手?
- 5.私有地址和公有地址及其工作方式?有哪些私有(保留)地址?
- 6.IP地址分为几类?为解决IP地址不够用的问题又作出了什么改变?
- 7.IP地址,MAC地址为何缺一不可?
- 8.描述路由表选路过程?
- 9.路径MTU发现工作原理?
- 10.简述DNS工作过程?
- 11.ARP 的工作过程?
- 12.NAT 的工作机制?
- 13.TCP 凭哪些来保证其靠性?
- 14.访问www.baidu.com的过程?
- 15.断开链接四次挥手?
- 16.滑动窗口,拥塞控制,流量控制?
- TCP粘包问题?
- 发送的Data长度?
文中图片均来自网络,若有侵权请联系我删除
开始解决问题!
1.TCP/IP,ICMP,ARP,FTP,DNS,DHCP,MTU,NAT这些,分别是什么?
TCP/IP协议
别说话,用图片感受
ICMP协议
作用:通过IP传送,用于辅助 IP 工作。通过ICMP返回包的消息类型标识确认IP包是否成功送达目标地址及通知在发送过程中IP包被废弃的具体原因,改善网络设置(比如重定向最优路径)。
粗俗点这个就是,主机发了包,路由器带着走了一遭之后,出现问题或者需要优化把信息回送给主机。
ping 指令就是通过ICMP回送消息实现的。
ARP协议
ARP 地址解析协议,将IP地址转换为 Mac 地址。
RARP 逆地址解析协议,将 Mac 地址转换为 IP 地址。
FTP协议
文件传输,将保存在其他主机上的文件下载到自己硬盘上。
文件传输过程中建立两个TCP连接,一是发出传输请求时所要用到的控制连接。二是实际传输时要用到的数据连接。
DNS查询
通过域名,像域名服务器查询该域名的地址。
DHCP协议
实现自动设置IP地址,统一管理IP地址分配的协议。减轻管理员的负担。
DHCP分配两种方式:一是在固定IP种选一个分配,二是针对Mac地址分配一个固定的IP地址。
文件:/etc/sysconfig/network-scripts/ifcfg-enp2s0
中可查改IP地址相关配置。
路径MTU
MTU是某链路上一次性允许通过的最大数据限制。
路径MTU指的是从发送端主机到接收端主机之间不需要分片时的最大MTU大小,为了防止TCP/IP传输过程中分片。
2.TCP 和 UDP的区别及用途?
TCP的建立连接过程在socket通信中,位于 listen, connect, accept段,详见这里
3.端口和服务间的关系及常用端口?
端口相当于一种数据的传输通道。用于接受某些数据,然后传输给相应的服务。
一台计算机能够运行多个程序。传输层通过端口号来识别本机中正在进行通信的主机并传输数据。通过源IP,目的IP,协议号,源端口,目的端口识别一个通信。
0-1023 属于知名端口号,用于HTTP,TELNET,FTP等广为使用的应用。 1024-49151 可以由用户自己用。49151-65535在服务器确定发送端口号,客户端没必要确定时,由系统动态分配。
TCP常用端口号:
ftp 21
ssh 22
telnet 23
http 80
https 443
nmap 命令可扫描开放的端口信息。netstat 用于检验本机各端口的网络连接情况。
4.TCP三次握手?
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
5.私有(保留)地址和公有(公网)地址是什么?有哪些私有地址?
公有地址是在 Intnet 中使用的地址。
私有地址是在局域网中使用的地址。
这些是每种类IP分的保留地址。可以在局域网中分配私有地址用。
7.IP地址,MAC地址为何缺一不可?
信息传递时候,需要知道的其实是两个地址:终点地址 和 下一跳地址。目的IP地址在跳过路由器的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。
这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。分层实现,用MAC地址和IP地址两个地址,用于分别表示物理地址和逻辑地址。这样分层可以使网络层与链路层的协议更灵活地替换,网络层不一定非要用IP协议,链路层也不一定非用以太网协议。
早期的以太网只有通过Mac地址寻址。
8.描述路由表选路过程?
netstat -r 查看路由表信息
路由控制表记录着网络地址与下一步应该发送至路由器的地址。
Destination 目的地址
Gateway 下一站路由
额,,我这个表里信息量过小,,反正就是这么查看的。
比如现在我是A,我要连接B。如果在同一链路直接通过网关连接。
如果不在,就查看目的地址选项有没有匹配的,如果有,找到匹配位数最多的发出去。
如果没有,发到默认路由。就那个default。
9.路径MTU发现工作原理?
发现过程:设置禁止分片标志位,发送IP数据包,IP包如果太大不能经过,会被丢弃。路由器返还一个ICMP包,其中包含自己的MTU。主机根据这个MTU继续发送数据包,成功经过这一跳。等到下一跳,如果再被丢弃,再得到一个MTU,如此反复,直到修改后的数据包大小不用分片到达接收端。最后的MTU就是路径MTU,开始按这个发送数据。
10.域名解析过程?
域名的组织形式:
解析过程
比如输入www.qq.com
1. 检查本地 hosts 文件有木有地址映射。
2. 查找本地 DNS 解析器缓存有木有。
3. 向本地的 DNS 服务器发送查询请求,此查询具有权威性。
4. 再找不到,根据DNS服务器的设置,转发给上一级服务器查询或者把请求发给根服务器。
5. 根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
11.ARP 的工作过程?
在IP层得到了IP地址,但是正常连接时需要IP地址和Mac地址,所以还需要地址解析协议ARP来得到Mac地址。
过程:比如在同一链路IP为A的主机要连接IP为B的主机,它会发送ARP请求包,里面有目标IP B,然后在此链路上广播。链路上的主机收到ARP包时查看是不是自己,不是就丢弃,是的话就把自己的Mac地址填进响应包返还给主机A。此时将B的Mac地址加入ARP缓存表,下次就不用广播了。
所以ARP接借助ARP请求和ARP响应两种类型的包来确定对方的Mac地址。
RARP是把 Mac 解析成IP。有些时候使用嵌入式设备不能通过 DHCP 获得 IP 地址,现在就搭建一个注册了 Mac 地址和 IP 地址的 RARP 服务器,设备需要时发请求给服务器,通过自己的Mac地址获得IP地址。
12.NAT 的工作机制?
NAT技术是用于在本地网络使用私有地址,在连接互联网时转入使用全局IP地址的技术。
NAT服务器的计算机有两个网卡:一个和内网相连,此网卡IP是私址类型(192.168.1.1);另外一个和外网相连,此网卡IP是公址类型,我们这为(连接到Intnet)。他把局域网和外网联系起来,并完成内外网地址(IP+端口)的映射工作。
NAT服务器器维护一张表,第一次将私有地址转换为全局地址时,存入此表中。当域内同时有多个私有地址要与外界通信时,把端口加进来,就是两个私有地址转换的是相同IP地址的不同端口。
13.TCP 凭哪些来保证其靠性?
TCP 通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
当接收端收到发送方发送的数据时,接收端返回一个收到消息的通知。这就是确认应答。如果超过重发超时的时间,发送方还未收到确认应答,发送端开始重发此段内容。 发送方在每次发包时都会计算往返时间及其偏差,将这个往返时间和偏差相加,重发超时就是比这个大一点的值。
序列号是按顺序给每个字节编号,接收端查收数据后,将自己下一步应该接收的数据序号作为确认应答返送回去。避免某次确认应答丢了而造成发送端不停发送。
连接管理就是三次握手四次挥手。
窗口控制大概就是我不用一个一个等应答,一次性发好几段过去,然后对多个段同时进行确认应答的功能。窗口在接收端,通过窗口来确认接收并应答。
窗口控制中的重发机制:没收到确认应答不会重发。连续3次收到同一个确认应答,将对该确认应答中的序列号进行重发。
14.访问www.baidu.com 的过程
1.客户端输入www.baidu.com,浏览器通过DNS解析(应用层)将域名解析为IP地址202.108.22.5 ,封成数据包,将数据交给传输层。
2.在客户端传输层,把HTTP会话请求分成报文段,添加源端口和目的端口,如服务器使用80端口监听客户端请求,客户端由系统随机分配端口比如5000,与服务器交互。TCP的主要功能是与百度服务器的TCP程序进行连接并建立会话。然后交给网络层。
3.网络层的IP协议主要功能就是选路。就是找到一条去往通过IP地址202.108.22.5的路(详见问题9),然后将自己的信息加到数据包头部,然后将数据包交给链路层。
4.这个层定义了通过物理网络输出数据所需的协议与硬件要求。多数电脑使用以太网,这个时候将IP数据加上以太网帧头和帧尾打包成以太网帧。
5.这个时候,电脑就开始传输以太网数据了。这时候数据真正离开你。等到达服务器后,自下而上解析数据包,过程与客户端相反,解析到请求数据。
6.然后,服务器就会用刚才同样的步骤生成一个以太数据包通过因特网传给电脑。然后浏览器就可以显示百度主页的内容了。
15.断开链接四次挥手?
- Client 要关闭连接了,调用 close() 发送 FIN 给 Server。
- Server 收到后,发送确认应答 ACK 给Client。但此时,它可能还有数据没有给Client发完。所以只关闭读通道,状态变为CLOSE_WAIT。
- 等 Server 数据发完后,调用close() 关闭socket, 然后向 Client 发送FIN,并关闭自己的写通道。
- Client 收到FIN后,关闭读通道,向Server 返回ACK确认报文,TCP 变为CLOSE,Client 进入 TIME_WAIT状态,等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP协议关闭连接过程彻底结束。
找了一张花里胡哨的图
16.滑动窗口,拥塞控制,流量控制?
滑动窗口
对于TCP会话的发送方,任何时候在其发送缓存内的数据可以分为4类:
- 已经发送并得到对端的ACK的
- 已经发送还未收到对端ACK的
- 未发送但对端允许发送的
- 未发送且对端不允许发送的
中间两部分数据称为发送窗口。
这个窗口对应这上面说过的窗口控制。也就是接收端窗口里,确认接收的过程。发送窗口是发送缓存区的一部分,应用层需要发送的数据存入发送缓存区,收到ACK报文,发送窗口在缓存中移动,将新的数据包含到窗口中准备发送。发送窗口中都属于已发送但未被确认的数据。
由于TCP是全双工模式,会话双方同时有发送,接受窗口。接收窗口取决于应用,系统,硬件的限制,各自的发送窗口取决于对端通告的接收窗口。
拥塞控制
网络拥塞条件:当对网络中的某种资源需求大于网络中的可用资源时,网络吞吐量会随输入负载的增大而急剧下降,网络进入拥塞状态。
TCP判断拥塞的方法:
- 某TCP报文确认超时(报文丢失,网络拥塞,一点传输能力都没有了)
- 收到相同报文段的3个冗余ACK(说明报文段未按序到达,但是网络还是有一定的传输能力的)
当检测到拥塞时,如何处理?
- 慢启动:为发送方的TCP增加了另一个窗口–拥塞窗口,记为cwnd,那么发送方的发送窗口的上限值<= min{cwnd,RWin}。
连接开始时,cwnd = 1 MSS,逐步试探网络状态,指数增长至阈值ssthresh - 加性增:当慢启动指数增长至阈值ssthresh时,若未检测到丢包事件,每个单位时间(RTT) cwnd += 1。
- 乘性减:分为两种:TCPReno乘性减,TCPTahoe乘性减,对应两种不同的丢包事件。
- 新版TCPReno(又称快速恢复):若检测到3个冗余的ACK,说明网络还不是完全堵塞,先ssthresh = cwnd / 2,再cwnd = cwnd / 2,再进入加性增状态
- TCPTahoe:若是报文超时,说明网络拥塞,先ssthresh = cwnd / 2,再将cwnd置为1 MSS,进入慢启动状态(图中废弃应该是不对的)
新版TCP是包括了快速恢复方法,两种乘性减都有 - 快速重传:在RFC 2581中,一旦对某报文收到了3个冗余的ACK,可以在该报文段的定时器过期之前就重传丢失的报文段
流量控制
假设情况,接收端因为高负荷丢弃了本应接收的包,就触发了重发机制,浪费了流量。
为了防止,TCP提供流机制可以让发送端根据接收端的实际接收能力控制发送的数据量。 具体就是:接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限制的数据。
来看示例图:
那个窗口探测,发送停了的时候它会时不时发一个探测试一下,因为B数据处理完了不会主动搭理你。
偷某大神学姐一张图,联系三次握手四次挥手看两端状态
17.TCP粘包问题
粘包出现原因:
在流传输中出现,UDP不会出现粘包,因为它有消息边界
1 发送端需要等缓冲区满才发送出去,造成粘包
2 接收方不及时接收缓冲区的包,造成多个包接收
为了避免粘包现象,可采取以下几种措施。
- 对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
- 对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
- 三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。
一种比较周全的对策是:接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开。对这种方法我们进行了实验,证明是高效可行的。还有对发送数据做加数据长度头部的处理。
18.电脑开机后如何获取IP?
开机后,一般是设置的DHCP自动获取IP地址。
这时候需要给DHCP服务器发送数据包以获取IP地址。
所以发送的数据包中要包含:
以太网头部:本机的Mac地址和DHCP服务器的Mac地址(此时不知,设置为广播地址FF-FF-FF-FF-FF-FF)。
IP头部:设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
UDP头部:设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。
以太网广播发送给所有子网。子网们收到后,将IP地址与自己比对,发现不是发给自己的,丢弃。
DHCP看到0.0.0.0知道是给自己的,分配好IP地址,发送回去一个”DHCP响应”数据包。
以太网头部:MAC地址是双方的网卡地址。
IP头部:DHCP服务器的IP地址(发出方)和255.255.255.255(接收方)。
UDP头部:端口是67(发出方)和68(接收方)。
数据部分:分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
19.HTPP请求报文和响应报文?
请求报文
由请求行,请求头部,空行和请求数据4部分组成。
19.数据Data长度大小?
数据幀最大长度为1500,然后IP首部占用20字节,UDP首部占用8字节,所以在传输层UDP包大小最大为1472字节。