# tcp/ip
- [1. 协议模型](#1__3)
- [1.1 tcp/ip四层和osi七层模型](#11_tcpiposi_7)
- [1.1.1 链路层](#111__13)
- [1.1.2 网络层](#112__16)
- [1.1.3 运输层](#113__18)
- [1.1.4 应用层](#114__20)
- [1.2 数据包传递](#12__24)
- [1.2 TCP/IP 协议族](#12_TCPIP__38)
- [2. 协议](#2__44)
- [2.1 arp协议](#21_arp_46)
- [2.2 ICMP](#22_ICMP_58)
- [2.3 IGMP](#23_IGMP_63)
- [2.1 模拟ping的过程](#21_ping_66)
- [2.2 经过交换机ping](#22_ping_97)
- [2.3 tcp](#23_tcp_134)
- [2.4 三次握手](#24__136)
- [3. 通信设备](#3__150)
- [3.1 交换机](#31__152)
- [3.2 集线器](#32__156)
- [3.2 路由器](#32__161)
- [4. http](#4_http_174)
## 1. 协议模型
1. TCP/IP是一组协议的总称,包括TCP、UDP、IP、 ICMP和IGMP等
### 1.1 tcp/ip四层和osi七层模型
![](https://box.kancloud.cn/611ded449e7dd5d9aface23e1a7a6438_487x266.png)
TCP/IP是四层网络协议系统,每一层都负责不同的通信功能。如上:
#### 1.1.1 链路层
有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
#### 1.1.2 网络层
有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括ip协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议( I n t e r n e t组管理协议)。
#### 1.1.3 运输层
主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。
#### 1.1.4 应用层
负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些
### 1.2 数据包传递
通用的应用程序:
- 数据包传输方式
单播 点对点
多播 一对多
广播 一对所有
192\.168.1.0 网络号
192\.168.1.255 广播地址
- ip地址与掩码按位与得到网络号,判断是否在同一网段中。
### 1.2 TCP/IP 协议族
![](https://box.kancloud.cn/54ac7a4b11053fe0457c7cb09ae293c7_753x311.png)
集线器用来连接多台电脑,但是数据会被广播。现在几乎不用了,现在都用交换机。交换机可搭建局域网
## 2. 协议
### 2.1 arp协议
> - 同义词 ARP协议一般指ARP(地址解析协议:Address Resolution Protocol)
> 以太网环境下,同一个网段的主机之间需要互相知道对方的MAC地址,才能访问。
> TCP/IP协议栈从上层到下层的封装过程中,第三层封装需要知道目的IP,第二层封装需要知道目的MAC。
1. 是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
2. 地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
### 2.2 ICMP
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
### 2.3 IGMP
Internet 组管理协议称为IGMP协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。IGMP协议共有三个版本,即IGMPv1、v2 和v3。
### 2.1 模拟ping的过程
- 使用packet tracer 工具模拟
1. ping
![](https://box.kancloud.cn/0e0932f3785e78d3faec4d339532fa0e_537x224.png)
1. 抓包
![](https://box.kancloud.cn/6e9cf0a5408dffa1c2eb2afaa7f0adad_1443x523.png)
192\.168.1.111 开始发包,单击上图中的邮件图标,包含了目标主机IP、MAC地址
![](https://box.kancloud.cn/65ed28344af12f2784a113bb915f442d_546x586.png)
192\.168.1.110 接受到数据包,来源
![](https://box.kancloud.cn/30ea2a46d7baa8abfafdbe84592e5498_1586x613.png)
192\.168.1.110将要发出去的包
![](https://box.kancloud.cn/90e826a32b23c1ab674211fdc92323ad_546x586.png)
### 2.2 经过交换机ping
交换机在第一次运行的时候,各个主机之间的MAC都是不知道的,所以使用ARP协议寻址。
1. 广播ARP协议包(PC2和PC3都会接到)
![](https://box.kancloud.cn/1f60233aed0274f86a4d5840ae424ac0_522x316.png)
![](https://box.kancloud.cn/221ee249843f310dd975c1399936b17d_531x558.png)
- 经过交换机的数据包的目标MAC是FFF....,代表所以MAC,这些ARP包会被广播到所有主机上
![](https://box.kancloud.cn/3a82b4766c9bf8434e6a026a705f7616_544x557.png)
走到交换机,交换机把包广播
![](https://box.kancloud.cn/1c524ee3cee9a698b7a3daedacedd2fe_396x282.png)
![](https://box.kancloud.cn/1ffb013f16cc1b382c91290568624d70_500x412.png)
由于ARP包中,包含目标IP,所以PC2的ARP包在这被舍弃了,PC3正好是目标IP,所以通过,并给ping发起方会ARP包,其中就表明了自己的IP,ping发起方保存他的MAC,然后用ICMP进行ping。
![](https://box.kancloud.cn/7d0175d2b46ba9376102f0b80c0064dc_405x269.png)
![](https://box.kancloud.cn/18b4cf9c821222cb0bd5a4e4d52a763b_492x365.png)
如图所示,ping接收方放回ARP协议包,其中包含了自己的MAC
![](https://box.kancloud.cn/da1fe87434c1e57afb1b8025c10feab9_546x572.png)
arp寻址结束,此时ping的发起方有两包(arp,icmp)
![](https://box.kancloud.cn/ce7185f0bd9d46d72828acf1886571a1_459x354.png)
此时目标MAC由ARP获得,ICMP开始ping,此时目标MAC不在是FFFF,FFFF,FFFF,FFFF,而是真正的目标MAC
这样ping开始发送ICMP包,ping真正开始。一个ICMP包从发送方发出到目标主机,然后返回给源机,完成一次ping
### 2.3 tcp
#### 2.4 三次握手
![](https://box.kancloud.cn/487440f02583e60cf0277229628ccf6a_814x543.png)
1. backlog
Linux内核为TCP维护两个队列,未连接队列和已连接socket连接用来存储 socket连接,设置backlog的数量即为这两个队列总和,所以backlog决定了serversocket可接受链接数量
1. 三次握手过程
1)当client 建立连接时发送SYN包到server端,server收到之后如果SYN QUEUE队列已满,直接丢弃不回ACK。客户端超时后经过3秒、9秒…的间隔时候不断重发SYN包。
2)当server的SYN QUEUE没有满时,server会回复SYN+ACK给client,如果client收到请求,则将状态修改为ESTABLISHED,并发送ACK给server。
3)server收到ACK,将状态修改为ESTABLISHED,并把该请求从SYN QUEUE中放到ACCEPT QUEUE。连接建立完成。
## 3. 通信设备
### 3.1 交换机
用于构建局域网,连接多台机器,并且具有学习的能力,就像上边做的例子那样,一开始没有目标主机MAC,所以会像集线器那样把ARP协议数据包广播,在收到目标机的回馈之后,本地缓存目标MAC地址。接着发送真正的数据包,这次不会被广播,因为知道目标的MAC地址。
### 3.2 集线器
和交换机的功能类似,只是不存在学习功能,会一直广播,所以有时可能会阻塞网络
### 3.2 路由器
路由器局有连接不同网段的主机的功能,提供地址转发,我们日常使用的路由器具有交换机(组局域网)、地址转发、路由表等功能。
我们能连接外网是因为路由器中的路由表,它记录了我们的程序的端口号和所要连接外网的端口号,等外网发来的数据回参照路由表记录找到局域网内的主机,然后数据就返回来了
![](https://box.kancloud.cn/4b4fd0dd9d481d016cf18e20cb5ee8b0_1586x865.png)
> - MAC在数据包传递的过程是变化的,而目标地址的IP是不变的,就像人与人手拉手传递东西一样,MAC就像人与人的手,而目标的那个人(IP)就像一个逻辑地点一样
![](https://box.kancloud.cn/581a238a580158e50842d02938d09f92_876x508.png)
## 4. http
> - 在四层模型中,http(应用层)规定了网络数据的一种传输格式,client和server按照指定的协议对数据进行解析,达到数据的共享,这就是为什么不同的浏览器(client)都可以一样的访问网站(server)
![](https://box.kancloud.cn/d4824bfa4db94e698d42a0f6f4803e06_1077x708.png)
> - 我们编写的socket程序,只是实现了下三层协议的功能,没有加入应用层的思想,所以安照http协议(应用层协议)来发送接收数据,就可以在浏览器和服务器间传输数据。
> client发送的http请求报文由请求行、请求头和请求正文组成,都有一个换行
![](https://box.kancloud.cn/f5b2c05d70d4317e9561d98a57f36778_1063x676.png)
请求格式
```
请求行\r\n
请求头\r\n
\r\n
请求正文
```
响应体格式
```
状态行\r\n # 换行
响应行\r\n #换行
\r\n # 响应正文与响应头之间空一行
响应正文
```
- 状态码
```
200 响应成功
302 跳转,跳转地址通过响应头中的Location属性指定(JSP中Forward和Redirect之间的区别)
400 客户端请求有语法错误,不能被服务器识别
403 服务器接收到请求,但是拒绝提供服务(认证失败)
404 请求资源不存在
500 服务器内部错误
```
> - URI、URL和URN之间的区别
> URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成
> URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源
> URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化
> HTTP规范将更通用的概念URI作为其资源标识符,但是实际上,HTTP应用程序处理的只是URI的URL子集
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 工具
- Git
- 初始本地仓库并上传
- git保存密码
- Gitflow
- maven
- 1.生命周期命令
- 聚合与继承
- 插件管理
- assembly
- 资源管理插件
- 依赖范围
- 分环境打包
- dependencyManagement
- 版本分类
- 找不到主类
- 无法加载主类
- 私服
- svn
- gradle
- 手动引入第三方jar包
- 打包exe文件
- Windows
- java
- 设计模式
- 七大原则
- 1.开闭原则
- 2. 里式替换原则
- 3. 依赖倒置原则
- 4. 单一职责原则
- 单例模式
- 工厂模式
- 简单工厂
- 工厂方法模式
- 抽象工厂模式
- 观察者模式
- 适配器模式
- 建造者模式
- 代理模式
- 适配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 规则
- 模板
- 合并单元格
- word
- 读取
- java基础
- 类路径与jar
- 访问控制权限
- 类加载
- 注解
- 异常处理
- String不可变
- 跨域
- transient关键字
- 二进制编码
- 泛型1
- 与或非
- final详解
- Java -jar
- 正则
- 读取jar
- map
- map计算
- hashcode计算原理
- 枚举
- 序列化
- URLClassLoader
- 环境变量和系统变量
- java高级
- java8
- 1.Lambda表达式和函数式接口
- 2.接口的默认方法和静态方法
- 3.方法引用
- 4.重复注解
- 5.类型推断
- 6.拓宽注解的应用场景
- java7-自动关闭资源机制
- 泛型
- stream
- 时区的正确理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的区别
- 多线程
- 概念
- 线程实现方法
- 守护线程
- 线程阻塞
- 笔试题
- 类加载
- FutureTask和Future
- 线程池
- 同步与异步
- 高效简洁的代码
- IO
- ThreadLocal
- IO
- NIO
- 图片操作
- KeyTool生成证书
- 压缩图片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的资源路径
- java开发规范
- jvm
- 高并发
- netty
- 多线程与多路复用
- 异步与事件驱动
- 五种IO模型
- copy on write
- code style
- 布隆过滤器
- 笔试
- 数据库
- mybatis
- mybatis与springboot整合配置
- pagehelper
- 分页数据重复问题
- Java与数据库之间映射
- 拦截器
- 拦截器应用
- jvm
- 堆内存测试
- 线程栈
- 直接内存
- 内存结构
- 内存模型
- 垃圾回收
- 调优
- 符号引用
- 运行参数
- 方法区
- 分带回收理论
- 快捷开发
- idea插件
- 注释模板
- git
- pull冲突
- push冲突
- Excel处理
- 图片处理
- 合并单元格
- easypoi
- 模板处理
- 响应式编程
- reactor
- reactor基础
- jingyan
- 规范
- 数据库