tcp/ip详解卷一读后记

2023-11-21 14:20
文章标签 ip 详解 tcp 后记 一读

本文主要是介绍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详解卷一读后记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_22226911/article/details/95335550
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/402877

相关文章

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化

Linux实现简易版Shell的代码详解

《Linux实现简易版Shell的代码详解》本篇文章,我们将一起踏上一段有趣的旅程,仿照CentOS–Bash的工作流程,实现一个功能虽然简单,但足以让你深刻理解Shell工作原理的迷你Sh... 目录一、程序流程分析二、代码实现1. 打印命令行提示符2. 获取用户输入的命令行3. 命令行解析4. 执行命令

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2