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



http://www.chinasem.cn/article/402877

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A