本文主要是介绍tcp/ip详解卷一读后记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.概述
1.tcp/ip是网络层的协议族,起源于美国60年代的研究项目,将网路进行了分层,共四层链路层(mac、交换机、网桥)、网络层(ip层、路由器;包括ip、icmp协议)、运输层(tcp/udp)、应用层
2.网络的ip按照类别+网络号+主机号 总共32位(ipv4)分成了A、B、C、D、E五类网址;这几种类型也不够使用了,因此划分了子网,主机没有办法区分子网号、主机号,因此增加了子网掩码的概念,子网掩码非0的位就是主机号
3.DNS是一个分布的数据库,用于主机号(域名)和ip的映射
4.网络端口中1-255的知名端口,256-1024的Linux系统端口
5.各层协议按照头部包裹的方式一层一层
14字节以太网首部 + 20字节ip首部 + 20字节tcp首部|8字节udp首部 + 应用数据 + 4字节以太网尾部
二.链路层
1.链路层是为上层ip层服务,运输ip报文的,并支持arp、rarp协议;mac只管一跳,ip负责路由寻址。
2.链路层协议包
6字节目的mac地址 + 6字节mac源地址 + 2字节下一层协议类型 + 下一层数据包 + 4字节CRC冗余校验码
3.链路层以太网有最小传输大小为46字节,最大传输单元MTU为1500,整条网络通路上的路径MTU取决于路径中最小的MTU
三.ip层
1.ip层是一个不可靠的(不保证IP数据报传送到达目的地,传输的可靠性交由传输层去做)、负责将数据报文从源ip到目的ip的一个无连接(不维护后续数据报的状态、不保序)的网间协议。
2.ip层有20字节的头部数据
a.第一个4字节
4位版本号(版本号为4,所以叫ipv4) + 4位首部长度(因为首部有可选字段所以可能超过20字节) + 8位服务类型(标识出使用最小延迟、最大吞吐、最可靠、最小费用) + 16位报文总长度(标识ip数据报的数据长度)
b.第二个4字节
16位标识(用于标识是否属于同一个ip报文,是因为mtu导致的分片行为,多个分片的这16位标识是一样的) + 3位标识(是否分片等) + 13位片偏移 由这几个字段可以保证ip层有能力对数据进行分片,也可以对上层透明的进行分片重组,分片的过程可能是源主机也可能是在传输路上进行分片,甚至可能分片后的报文再次分片,如果设置了不可分片标志但是不满足MTU会收到ICMP不可达
c.第三个4字节
8位TTL生存时间(一般为64,每一跳路由就减1,如果为0则丢弃并返回给主机ICMP报文目的不可达) + 8位协议(下一层包裹的协议是什么TCP/UDP/ICMP) + 16位首部校验和
d.第四个4字节
32位源ip地址
e.第五个4字节
32位目的ip地址
3. 在传输过程中ip选路比较简单,一般主机选择默认路由发送,路由器中的ip路由表完成选路;搜索路由表精确匹配、搜索路由表网络号匹配、搜索路由表寻找默认的表目 可以通过netstat -rn 查看本机路由表
4. 路由选路策略根据ICMP返回码、RIP选路信息协议来动态更新路由表,RIP是指相邻的路由器之间会采用RIP进行通信,路由守护进程收到其他路由器发送来的信息更新内核中的路由表,另外还有其他的OSPF、BGP、CIDR等协议来支持路由策略
四.ARP/RARP
ARP是通过根据IP地址获取MAC地址的地址解析协议,方法是发送IP地址广播到网络上所有主机
RARP是通过MAC地址查找IP地址的逆地址解析协议
五.ICMP
ICMP是IP层协议,但是又是在构建在IP层协议之上的,IP头部 + ICMP头部构成报文,是网间控制协议,是网络不可达、端口不可达、主机不可达等等错误发生时反馈给主机的
ping命令使用的就是ICMP协议
六.UDP协议
1.udp协议非常简单,不提供可靠传输,从协议头部字段就可以看出来
16位源端口 + 16位目的端口 + 16位报文长度 + 16位校验和(可选,但一般都使用) 只有8字节
2.广播和多播只应用于udp
3.udp由于其不可靠性,但是由于简单因此payload小、性能要比tcp好,且可用于一对多、多对多,应用于在不需要非常可靠、需要大量传输的应用中,例如直播、视频、qq语音等;而tcp一般用于文件传输、http、ftp、邮件等对数据准确性要求高、又不是非常紧急的应用。
4.面对udp、tcp这两种不同的协议、不同的应用场景,而现实中既需要可靠传输又需要快速传输,因此发展出了很多基于udp的可靠传输协议,例如谷歌的quic、开源udt等。
七.TCP协议
1.tcp协议是一个面向连接的(三次握手、四次挥手)、全双工的(一个连接建立后两方都可以通过这个连接发送数据)、可靠的(接收后有ACK响应)、保序的(有序列号)、可以根据网络情况和对端接收情况对流量大小作出动态调整的(滑动窗口、慢启动、拥塞避免、快速恢复、快速重传等机制)传输协议。
2.tcp首部为20字节
a.第一个4字节 16位源端口 + 16位目的端口,一个连接由源目的ip + 源目的端口确定
b.32位序号 字节序,使得数据传输过程中可以保序
c.32位确认序列号 对方发来序号J的数据,收到后回复J+1标识收到了
d.4位首部长度(用于看是否有选项数据) + 保留6位 + 6位标识(URG、ACK、PSH、RST、SYN、FIN)用于标识报文类型 ——16位窗口大小(用于告知对端,目前自己可以接收的报文字节长度)
e.16位校验和(用于报文校验) + 16位紧急指针(用于紧急数据传输)
3.tcp连接的建立
通过三次握手,在不可信的信道中确保双发通路均可用,首先发送方A发送SYN J请求建立连接变为SYN_SENT,接收方B发送SYN K, ACK J + 1进入SYN_RCVD状态,A接收到后识别B已经收到J序号报文进入ESTABLISHED状态,并发送响应ACK K + 1,B接收到后也进入ESTABLISHED状态
另外有很小的几率,A、B同时发送SYN,TCP协议保证只建立一个连接,此种情况需要四次连接确立连接
4.tcp连接的关闭
tcp连接需要4次挥手进行关闭,较为复杂
其中要关注主动关闭放进入time_wait状态,被动关闭放有close_wait状态。
其中time_wait状态非常特殊,需要等待2msl(tcp规定的报文段最大生存时间)时间后才进入close,这是因为a.防止主动关闭方最后一个ack发送失败导致对端一直无法进入close,超时未确认会触发重传,另一方面是如果立即close然后再次建立连接会导致在前身(上一次同一个ip、同一个端口的链接)的数据到来时无法识别,一旦进入time_wait后数据包直接进行丢弃不在使用从而保证没有异常
5.流量方面的控制
发送方通过拥塞窗口来动态调整发送的数据大小,以避免网络拥堵,发送方根据拥塞窗口和滑动窗口的大小中最小值选择发送数据。
最初始发送可以选择慢开始算法:先将拥塞窗口cwnd置为1,收到确认后*2,通过指数递增的方式进行增加,发送过程中如果出现网络拥塞(超时未收到确认)则记录此时的值未门限sshresh = cwnd / 2 且置cwnd = 1,当cwnd < ssthresh使用慢开始,当cwnd > ssthresh时候使用拥塞避免(不在指数增加,而是)线性增加。
另外还有一个算法叫快速重传,是指当连续收到3个重复ACK时,则认为包有丢失不等待超时就进行重传,对应的在拥塞控制中经常与快启动一起使用;
快启动是指当达到网络拥塞时候,并不是将cwnd置为1,而是置cwnd = ssthresh,从中间开始启动,这是因为tcp认为连续收到3个ACK认为网络还Ok,并不是非常堵塞。
6.nagle算法用于拥塞控制,是防止tcp小包太多导致的网络拥堵,nagle算法要求网络上最多只有一个未收到ACK的小包存在,如果应用场景的确需要大量传递小包,可以通过TCP_NODELAY来关闭算法
7.基于tcp机制的攻击和防范
tcp在连接过程中存在大量syn请求,可能存在syn攻击,可以通过加固tcp/ip协议栈如调整最大半连接数,缩短超时时间、增加backlog队列,限制syn并发等来防止这种ddos攻击,还可以使用防火墙来代理实现
tcp在断开连接收的time_wait在高并发的短连接情况下,有可能导致服务没法进行新的链接,可以通过修改/etc/sysctl.conf来处理
编辑内核文件/etc/sysctl.conf,加入以下内容:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
这篇关于tcp/ip详解卷一读后记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!