TCP、UDP及IP协议总结
TCP协议常见知识
TCP协议特点 和 首部格式
源端口(Source Port),目标端口(Destination Port) 各2字节
源端口号,标识主机上发起传送的应用程序;目的端口标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个TCP连接。一个I P地址和一个端口号有时也称为一个插口(socket),插口对(socket pair)(包含客户I P地址、客户端口号、服务器 I P地址和服务器端口号的四元组 )可唯一确定互联网络中每个TCP连接的双方。IP+TCP端口唯一确定一个TCP连接。
TCP协议通过使用"端口"来标识源端和目标端的应用进程。 端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。
封包序号(Sequence Number) 4字节
由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。
序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号(Acknowledge Number) 4字节
为了确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的响应,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。这个号是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移(Data Offset)4比特
和IP数据包头部一样,也有个Options字段,长度是不固定的,而为了要确认整个TCP封包大小,就需要这个标志来说明整个封包区段的起始位置。
这个字段指出TCP报文段的数据起始处距离 TCP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。
没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
保留字段(Reserved) 占6比特
保留为今后使用,但目前应置为0。
状态控制码(Code,Control Flag)
标志位字段(U、A、P、R、S、F):占6比特。各 比特的含义如下:
URG:紧急比特(urgent),当URG=1时,表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。
ACK:确认比特(Acknowledge)。只有当ACK=1时确认号字段才有效,代表这个封包为确认封包。当ACK=0时,确认号无效。---TCP的3此握手后2次ACK=1的。
PSH:(Push function)若为1时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送。
RST:复位比特(Reset) ,当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
SYN:同步比特(Synchronous),SYN置为1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。。
FIN:终止比特(Final),用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
滑动窗口(Window) 占2字节
窗口字段用来控制对方发送的数据量,可以告知对方目前本身有的缓冲器容量(Receive Buffer) 还可以接收封包。当 Window=0 时,代表缓冲器已经额满,所以应该要暂停传输数据。单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限,这个值是本机期望一次接收的字节数。
TCP校验和(Checksum) 占2字节
当数据要由发送端送出前,会进行一个检验的动作,并将该动作的检验值标注在这个字段上; 而接收者收到这个封包之后,会再次的对封包进行验证,并且比对原发送的 Checksum 值是否相符,如果相符就接受,若不符就会假设该封包已经损毁,进而要求对方重新发送此封包!在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
紧急指针(Urgent Pointer) 占2字节
这个字段是在 Code 字段内的 URG = 1 时才会产生作用。可以告知紧急数据所在的位置(紧急指针指出在本报文段中的紧急数据的最后一个字节的序号)。
选项(Options) 长度可变。
TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。
目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用, 表示可以使用任意数据区段的大小。 这个字段较少使用。
TCP首部的主要选项:
最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”--
---注意:MSS应在保证IP层不分片的情况下尽量大些,IP层如果收到的数据太大,会依据链路层的最大传送单元MTU(链路层的协议规定了一个数据帧中数据字段的最大长度),进行分片传输,然后接收方在进行组合,这是很耗费时间的。
填充字段(Padding)
如同 IP 封包需要有固定的 32bits 表头一样, Options 由于字段为非固定, 所以也需要 Padding 字段来加以补齐才行。同样也是 32 bits 的整数。
这是为了使整个首部长度是4字节的整数倍。
UDP协议的特点 和 首部格式
TCP和UDP的区别
- TCP面向连接(read/write/send/recv),而UDP无连接(sendto,recvfrom)
- TCP是可靠传输(超时重传+数据应答),UDP不可靠
- TCP是点对点连接,UDP可以一对多的
- TCP面向字节流,UDP面向数据报
- TCP给HTTP,HTTPS,FTP,TELNET,SMTP等使用,UDP给DNS,DHCP,NFS,IGMP,TFTP等
TCP、UDP、IP首部长度
TCP首部最小长度是20字节,最大是60字节
UDP只有8个字节
IP数据首部最小长度是20字节,最大是60字节
OSI模型TCP/IP模型
OSI是7层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP层:网络接口层、网际层、运输层和应用层
5层协议:物理层、数据链路层、网络层、运输层和应用层
如何保持TCP的可靠传输
超时重传机制 + 数据应答机制
停止等待协议的介绍
- 无差错-收到确认之后就进行下一次的发送
- 出现差错-在指定的时间内没有收到确认(超时计时器),进行重新发送
- 确认丢失 或者 确认迟到 确认丢失,超时后,发送方继续发送,接收方收到之后,不接收,但是会再发一条确认。确认迟到的话,发送方会再次发送,接收方收到之后,不接收,同时再次发送确认。
- 信道的利用率 利用率低,引入流水线型 连续ARQ协议
连续ARQ协议
滑动窗口的介绍
- 正常情况下
- 未按序收到的情况下
- 滑动窗口为0的异常情况
持续计时器完成,发送一个零窗口的探测报文。
滑动窗口和缓存之间的关系
超时重传的时间选择
TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的加权平均RTTs。
选择确认SACK【主要注意最多只能提供四个连续块的(8个序号)】
如果要使用SACK那么在建立TCP连接时,就要在TCP的首部中加上允许SACK的选项字段,双方必须协商好,选择SACK后原来的ack依然有效,只是以后在TCP报文段的首部中都加上SACK选项,以便报告收到的不连续的字节块的边界。
边界信息每个边界需要8个字节,而TCP首部选项长度最大是40个字节,所以最多是4个字节块。
TCP的流量控制的实现(Nagle算法)
- 滑动窗口
前面讲过
2. 效率的问题 Nagle算法的思想(发送方)
3. 糊涂症(接收方)
4个计时器
- 超时重传计时器,每次TCP发送一个数据后都要开启超时重传计时器,时间到了还没有收到确认就重传数据。
- 滑动窗口过程如果接收端的确认窗口是0,发送端不发送数据,怎么持续下去?TCP为每个连接设置了一个持续计时器,只要收到对方的零窗口通知,就启动该计时器,时间到则发送0窗口探测报文段(仅携带1字节数据),接收端在确认报文中给出现在的窗口值即可。
- 保活计时器,客户端突然发生故障,服务器端不能一直等着啊?TCP为每个连接设置一个保活计时器,每次收到客户端的数据就更新保活计时器,时间设置一般是2小时,若2小时没有收到数据,就发送一个探测报文段,以后每隔75分钟发一次,连续10个探测报文段没响应,就关闭连接。
- TCP挥手时主动关闭的一方会进入TIME-WAIT状态,关闭A到B的连接后,A进入TIME-WAIT状态,等待B关闭到A的连接,这时用到了时间等待计时器,A会等待2MSL时间。MSL为最长报文段寿命,一般为2分钟。
零窗口
TCP规定,即使确认报文中窗口设置为0,也必须接收以下数据:零窗口探测报文段,确认报文段和携带紧急数据的报文段。
MTU和MSL以及MSS
MSL:最长报文段寿命,一般2分钟,TCP连接释放时,主动方必须经过2MSL后才进入CLOSED状态,因此主动方关闭时间比较晚;
MSS:TCP最大报文段(数据部分)传输长度,在TCP报文的首部中设置,可以通过getsockopt和setsockopt获取和设置TCP_MAXSEG,MSS=TCP报文段长度-TCP首部长度;
MTU:数据链路层最大帧长度,IP层数据段不能大于MTU,否则分片传输,效率降低了,一般是1500字节。
TCP的拥塞(se)控制
- 和流量控制的区别
拥塞控制是防止网络的阻塞,流量控制是端到端的,防止发送方的数据不要发送的太快。
- 两种实现方式 和 触发的条件
2.1慢开始-拥塞避免 触发条件:确认没有按时收到,即只要发生超时重传
2.2 快重传-快恢复 收到连续三个相同的确认
- 为什么快重传快恢复会更加的好
在调整的阶段,是变为阈值的大小,而不是从1开始,因为收到了连续三个相同的确认,表名当前网络很大可能是良好的。
- 4. 滑动窗口的大小是怎么确定的
根据拥塞窗口(cwnd)的大小 和 接收方给定的窗口(window)的大小确定的,谁小就是谁。
TCP的三次握手
- 连接图
- 2. 为什么需要第三次
防止已失效的请求报文在经过一段时间之后又到达了服务端。创建了新的连接。
- 3. 为什么不用四次
和使用三次的效果是一样的。
- 4. TCP三次握手存在什么样的缺陷,如何预防和改进
发起连接的一方不进行连接的确认,耗尽服务器的资源。
解决方法:缓存的方法,确认收到来自客户的ACK之后再进行创建TCB;Session的方式;防火墙
TCP的四次挥手
- 连接图
- 2. 为什么握手需要三次,挥手却使用的是四次
a) 因为在服务端的ACK和FIN阶段是必须分开的,这是一个半连接的状态,服务端可能还会给客户端发送信息。
- 3. 为什么要有TIME_WAIT状态,有何作用
a) 主动关闭方的最后一次确认能够正确的被对象收到。
b) 让本网络中的 已失效的连接请求报文段 在本连接中消失。
TCP的有限机状态[面试要求自己能够手动画出]
状 态 |
描 述 |
CLOSED |
呈阻塞、关闭状态,表示主机当前没有活动的传输连接或正在进行传输连接 |
LISTEN |
呈监听状态,表示服务器正在等待新的传输连接进入 |
SYN RCVD |
表示主机已收到一个传输连接请求,但尚未确认 |
SYN SENT |
表示主机已经发出一个传输连接请求,等待对方确认 |
ESTABLISHED |
传输连接建立,通信双方进入正常数据传输状态 |
FIN WAIT 1 |
(主动关闭)主机已经发送关闭连接请求,等待对方确认 |
FIN WAIT 2 |
(主动关闭)主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 |
TIMED WAIT |
完成双向传输连接关闭,等待所有分组消失 |
CLOSING |
双方同时尝试关闭传输连接,等待对方确认 |
CLOSE WAIT |
(被动关闭)收到对方发来的关闭传输连接请求,并已确认 |
LAST ACK |
(被动关闭)等待最后一个关闭传输连接确认,并等待所有分组消失 |
各层常用协议
OSI中的层 |
功能 |
TCP/IP协议族 |
应用层 |
文件传输,电子邮件,文件服务,虚拟终端 |
TFTP(69),HTTP(80),SNMP,FTP(21),SMTP(25),DNS(53),Telnet(23) 等等 |
表示层 |
数据格式化,代码转换,数据加密 |
没有协议 |
会话层 |
解除或建立与别的接点的联系 |
没有协议 |
传输层 |
提供端对端的接口 |
TCP,UDP |
网络层 |
为数据包选择路由 |
IP,ICMP,OSPF,EIGRP,IGMP |
数据链路层 |
传输有地址的帧以及错误检测功能 |
SLIP,CSLIP,PPP,MTU |
物理层 |
以二进制数据形式在物理媒体上传输数据 |
ISO2110,IEEE802,IEEE802.2 |
网络层特点
IP协议是网络层使用的协议,与之相关的还有ARP协议,ICMP协议,IGMP协议
注意:网络层只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
IP地址分类和特点
- A类地址
A类地址范围:1.0.0.0~126.255.255.255
A类地址网络号字段占据一个字节,只有7位可以使用,可指派的网络号是126(2^7-2)个。减2的原因是:IP地址网络段全为0表示this,意思是本网络;IP网络号127(01111111)保留作为本网络的换回测试本主机的进程之间的通信。
A类地址主机号占3个字节,因此每个A类网络的最大主机数是2^24-2.减2的原因是:全0的主机号字段表示该IP地址是本主机所连接到的单个A类网络地址。例如一个Ip地址是5.6.7.8那么其所在的网络地址是5.0.0.0,而全1表示所有的,全1表示该网络上所有的主机。
- B类地址
B类地址128.1.0.0~191.255.255.255
- C类地址
C类地址192.0.1.0~223.255.255.255
- D类地址
D类地址224.0.0.0~239.255.255.255,多播地址,一般不用的
- 5. E类地址
E类地址240.0.0.0~255.255.255.255,保留不用的
私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码
子网掩码为前面是连续的1,然后全是0,为扩展IP使用范围,使用子网掩码技术,对网络进行更细划分得到子网,即和子网掩码与运算得到结果相同的属于一个子网。
注意:规定现在网络必须使用子网掩码,路由器中必须有这一行,这样已知IP地址和子网掩码只要进行与运算马上就可以得出网络地址。
l 对划分子网的好理解,这样得到的是子网地址
l 对不划分子网的,规定必须使用默认子网掩码,默认子网掩码中1的位置和网络号字段net-id正好对应,因此得到的也是网络地址。比如A类假如某个公司没有划分子网那么默认子网掩码就是:0xff000000,这样与运算后肯定是A类网络地址。0xffff0000同理是B类网络的默认子网掩码。
IP地址和MAC地址
ARP协议
ARP协议的用途是从网络层使用的IP地址解析出数据链路层使用的硬件地址。
注意:ARP是解决同一个局域网上的主机或路由器的IP地址和MAC地址的映射问题,不同网络上的行不通的。
ARP过程:
IP协议首部字段
版本号:IP地址的版本号,通信双方版本号必须一致
首部长度:占4个字节,最大15,注意其表示单位是4字节。即最大表示15个4字节
区分服务:一般不用
总长度:首部和数据长度之和
标识:IP软件维护一个计数器,每产生一个数据包,计数器加1,注意这里是IP分片时候使用的,当IP数据太多(大于MTU)需要分片时,每片的标识一致才能合并回来
标志:和分片有关,占3位,最低位MF=1标识后面还有分片,中间一位DF=1表示不能分片
片偏移:某片在原分组的位置,片偏移以8字节为一个单位
生存时间(TTL):表明该数据包在网络中的寿命,目的是防止无法交付的数据报在网络中兜圈子,TTL表明该数据包最多经过多少路由器,显然最大值是255,路由器在转发数据包之前把TTL减1,如果为0这时就丢弃该数据包,显然如果TTL=1表示该报文只在本局域网中传输。
协议:指明此数据包携带的适何种协议的数据,如TCP、UDP,ICMP等,目的主机判断后就可知道该交给谁了
首部校验和:只检查首部,不检查数据部分
路由器分组转发算法
ICMP协议特点
ICMP协议应用
traceroute指令
traceroute从源主机向目的主机发送一连串的IP数据包,数据包中封装的是不可交付的UDP数据包(使用非法的端口号)。第一个IP数据包P1的TTL设为1,当第一个P1到达第一个路由器R1时,R1先收下它,然后把TTL减1,由于TTL减1后为0,这时丢弃该报文,同时向源主机发送ICMP时间超过差错报告报文。
面试:两台笔记本ping不通,你觉得可能存在哪些问题?
答: (1)首先考虑是否是网络的问题
(2)局域网设置问题,电脑互联是要设置的。看是否安装了必要的网络协议,最重要的是IP地址是否设置正确。
(3)网卡驱动未安装正确
(4)防火墙设置有问题
(5)是否有什么软件阻止了ping包
linux下最简单的禁ping方法
首先登陆服务器终端之间执行:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
这样就可以禁ping了。如果想恢复ping可以执行命令
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
路由选择协议
1.路由器和交换机的区别?
交换机用于局域网,利用主机的MAC地址进行数据传输,而不需要关心IP数据包中的IP地址,它工作于数据链路层。路由器识别网络是通过IP数据包中IP地址的网络号进行的,所以为了保证数据包路由的正确性,每个网络都必须有一个唯一的网络号。路由器通过IP数据包的IP地址进行路由的(将数据包递交给哪个下一跳路由器)。路由器工作于网络层。由于设备现在的发展,现在很多设备既具有交换又具有路由功能,两者的界限越来越模糊。
2. 网桥的作用
网桥是一个局域网与另一个局域网之间建立连接的桥梁。
3.路由表是做什么用的?在Linux环境中怎么配置一条默认路由?
路由表是用来决定如何将一个数据包从一个子网传送到另一个子网的,换句话说就是用来决定从一个网卡接收到的包应该送到哪一个网卡上去。路由表的每一行至少有目标网络号、子网掩码、到这个子网应该使用的网卡这三条信息。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的子网掩码与数据包中的目标IP地址做逻辑与运算(&)找出目标网络号。如果得出的结果网络号与这一行的网络号相同,就将这条路由表六下来作为备用路由。如果已经有备用路由了,就载这两条路由里将网络号最长的留下来,另一条丢掉(这是用无分类编址CIDR的情况才是匹配网络号最长的,其他的情况是找到第一条匹配的行时就可以进行转发了)。如此接着扫描下一行直到结束。如果扫描结束仍没有找到任何路由,就用默认路由。确定路由后,直接将数据包送到对应的网卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。
在Linux上可以用“route add default gw<默认路由器 IP>”命令配置一条默认路由。
- 4. 每个路由器在寻找路由时需要知道哪5部分信息?
目的地址:报文发送的目的地址
邻站的确定:指明谁直接连接到路由器的接口上
路由的发现:发现邻站知道哪些网络
选择路由:通过从邻站学习到的信息,提供最优的到达目的地的路径
保持路由信息:路由器保存一张路由表,它存储所知道的所有路由信息。
- 5. IGP,RIP,OSPF,EGP介绍
答:(1)IGP:内部网关协议,即在一个自治系统内部使用的路由选择协议,如RIP和OSPF。
(11)RIP是一种分布式的基于距离向量的路由选择协议,要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离向量。距离即是跳数,路由器与直接相连的网络跳数为1,以后每经过一个路由器跳数加1。RIP允许一条路径最多包含15个路由器,因此当距离为16时认为不可达,这因为如此限制了网络的规模,说明RIP只能工作在规模较小的网络中。RIP的三个要点:仅和相邻路由器交换信息;交换的信息是当前路由器知道的全部信息,即路由表;按固定的时间间隔交换路由信息,如30秒。RIP协议使用运输层的用户数据报UDP进行传送,因此RIP协议的位置位于应用层,但是转发IP数据报的过程是在网络层完成的。RIP是好消息传播的快,坏消息传播的慢。
(12)OSPF:最短路径优先,三个要点:采用洪泛法向本自治系统的路由器发送信息;发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息;只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。OSPF直接使用IP数据包传送,因此OSPF位于网络层。
EGP:外部网关协议,若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中,如EGP。