Muxx


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

解读tcp协议

发表于 2017-12-14

简介

字面上来讲,可能有人会认为tcp/ip是指tcp与ip两种协议。然而很多情况下,它只是利用ip进行通信所必须用到的协议群的统称。具体来说,ip或icmp、tcp、或udp、telnet或ftp一级http等都属于tcp/ip的协议。tcp/ip一词泛指这些协议、因此,有时也称tcp/ip为网际协议族

互联网进行通信时,需要相应的网络协议,TCP/IP原本就是为了使用互联网而开发指定的协议族。因此互联网的协议就是TCP/IP,TCP/IP就是互联网的协议

20180623152973702027950.png
image_1bfkgsm031nqo10h4hqo1mst19c39.png-20.8kB

概念

icmp协议(internet control message protocol): 用于在ip主机、路由之间传递控制消息。控制消息是指网络不通、主机是否可达、路由是否可用等网络本身的消息。
arp协议(address resolution protocol): 根据ip地址获取物理地址的一个tcp/ip协议。
MSL(Maximum Segment Lifetime): 报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃,在linux上MSL为30秒
RTO(retransmission trip timeout): 重传超时时间。主机发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久会重传这个数据包。主机从发出数据包到第一次TCP重传开始,RFC将这段时间间隔称为retransmission timeout,简称RTO。
RTT(round trip time): 请求往返时间

TTL(time to live): 存在于IP协议头中的8位长度数据,值为数据包到达目的地之前允许经过的路由器跳数,通常用于判定数据包在网络中的时间是否太长而应被丢弃。每经过一个路由,该值减1,当TTL为0时,路由器就酱该数据包丢弃,并向源端发送一个ICMP差错报文,TTL可以防止数据包陷入路由环路

路由环路是指数据包在一系列路由器之间不断传输却始终无法到达其预期目的网络的一种现象
IP协议是一种不可靠的协议,无法进行差错控制。但IP协议可以借助其他协议来实现这一功能,如ICMP

TCP/IP4层模型

应用层、传输层、网络层、数据链路层

数据链路层

不同数据链路最大的区别是它们各自的最大传输单位(MTU)不同,MTU在以太网中是1500字节,FDDI中是4352字节,ATM中是9180字节

那么如何传输大于MTU的IP包呢?
为解决这个问题,IP包会进行分片处理,意思就是将较大的IP包分拆成较小的IP包,分片的包到对端目的地址后会再被组合起来传给上一层。即从IP的上层来看,MTU完全是透明的。

TCP数据报文构成


TCP报文: 由 TCP头部 和 TCP数据 组成。
TCP头部: 由 20字节的固定长度 和 可变长字段(选项和填充)组成。

TCP头部总长度: 由TCP头中的“数据偏移/头部长度”字段决定,最大60字节
选项和填充的长度: = TCP头部总长度 - 20字节的固定长度。由头部总长度的计算可知,TCP头部总长度最大为60字节,那么“选项和填充”字段的长度最大为40字节。填充是为了使TCP头部为4byte的整数倍

头部

端口号           确定目标应用
序号             解决乱序
确认序号          解决丢包问题
状态标志位        连接维护
窗口大小          流量控制 拥塞控制,明确指出现在允许对方发送的数据量,它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
校验和           占2个字节,由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验 TCP 报文段在传输过程中是否损坏,如果损坏这丢弃,这是TCP可靠传输的一个重要保障
数据偏移(头部总长度)  总占用0.5个字节(4位),该字段指出tcp报文段的头部长度,该字段占4bit,取最大的1111时,也就是十进制的15,TCP头部偏移单位为4byte,那么TCP头部长度最长为15*4=60字节。
保留            占0.75个字节(6位)。 保留为今后使用,但目前应置为 0
紧急指针       只有当URG标志为为1时紧急指针有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加标识紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式
阅读全文 »

mianjing

发表于 2017-12-08

redis常见问题

[TOC]

基础概念相关

1.什么是redis
2.redis的特点有哪些
3.memcache与redis的区别有哪些
4.redis相比memcache有哪些优势
5.如何实现本地缓存?请描述一下使用方式
6.redis的通讯协议是什么?有什么特点
8.redis过期策略
9.redis事件模型
10.redis与memcache有什么不同
11.redis在bgsave时会提高负载因子,为什么?

阅读全文 »

nginx开启status模块

发表于 2017-12-08

描述

Nginx本身内建有一个简单的即时状态显示模块 stub_status,只要开启 stub_status 模块就以看到基本的Web服务器状态统计,其提供的信息包含:目前连线数统计、请求数量统计等等

安装

status模块默认不开启,需要编译时加入–with-http_stub_status_module。
brew中默认nginx包不包含status模块,在网上找到一个带有大量编译模块的nginx包nginx-full

1
2
3
4
5
6
7
8
#使用nginx-full Formula
brew tap homebrew/nginx
#查看包安装选项 可以发现包含大量可编译模块
brew options nginx-full
#安装时添加status模块
brew install nginx-full --with-status

创建location规则

1
2
3
4
5
6
7
8
9
server{
location /nginx-status {
allow --------
allow --------//允许的ip
deny all;//
stub_status on;
access_log off;
}
}

这时通过domain.com/nginx-status就可以访问到状态页面

状态详解

active connections – 活跃的连接数量
server accepts handled requests — 总共处理了11989个连接 , 成功创建11989次握手, 总共处理了11991个请求
reading — 读取客户端的连接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.

Mysql连接数

发表于 2017-12-07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#查询当前连接数
show status like 'Threads_connected';
#查询最大连接数
show variables like 'max_connections';
#修改最大连接数
方法一 [即时生效] 需要root权限
set GLOBAL max_connections = 200;
方法二 修改my.cnf文件
max_connections = 200
注: 最大连接数5.7版上限100000
#查看连接信息 root用户可以看到所有连接信息,普通用户只能看到自己的连接信息
show processlist;
show processlist只能列出100条,如果要全列出使用 show full processlist
+----+------+-----------------+--------+---------+------+----------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+--------+---------+------+----------+-----------------------+
| 7 | root | localhost:62599 | sakila | Sleep | 13 | | NULL |
| 8 | root | localhost:62600 | NULL | Sleep | 53 | | NULL |
| 12 | root | localhost | NULL | Query | 0 | starting | show full processlist |
+----+------+-----------------+--------+---------+------+----------+-----------------------+

curl超时阻塞问题

发表于 2017-12-07

问题描述

最近写了一个脚本,定时curl访问某一个接口,但是发现在执行一段时间后就卡住不在执行了

左思右想,最终发现栽在curl超时时间上,CURLOPT_TIMEOUT默认值是0(无限等待),表现出来就是卡死

1
2
3
4
5
6
7
8
9
10
...
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); //尝试连接时的超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, 2); //执行时的超时时间
...
if(curl_errno($ch)){
echo 'Curl error: '.curl_error($ch).PHP_EOL;
}
curl_close($ch);

加上超时时间后,问题解决。加上后可以看到错误输出确实有大量超时错误

Curl error: Connection timed out after 2001 milliseconds
Notice: Undefined offset: 1 in /home/projects/php/beizhu.php on line 142
Curl error: Operation timed out after 2002 milliseconds with 0 bytes received

mysql架构演进

发表于 2017-12-03

最初的技术选型

作为创业公司,最重要的一点是敏捷,快速实现产品,对外提供服务,于是我们选择了公有云服务,保证快速实施和可扩展性,节省了自建机房等时间。在技术选型上,为快速的响应业务需求,业务系统使用python做为开发语言,数据库使用Mysql。如下图所示,应用层的几大系统都访问一个数据库。
image_1c0duhdbm2ub1l451u6h145ioqum.png-75.3kB

阅读全文 »

pipeline设计模式

发表于 2017-12-03

概念

管道模式用于将复杂的进程分解成多个独立的子任务。每个独立的任务都是可复用的,因此这些任务可以被组合成复杂的进程。

这种模式允许你讲庞大的进程分解成更小的子任务,这些子任务将数据进行处理并将处理后的结果传递给下一个子任务。就像流水线一样,有条不紊,从原料加工到成品,实现一道完整的工序。

管道中的每一个任务都会接受并返回同一类型的数据,这样子任务可以在管道中被添加、移除或者替换,而不影响其它子任务。

Laravel 在框架中的很多地方使用了管道设计模式,最常见的就是中间件的实现

当请求最终到达控制器动作被处理前,会先经过一系列的中间件。每个中间价都有一个独立的职责,例如,设置 Cookie、判断是否登录以及阻止 CSRF 攻击等等。

每个阶段都会对请求进行处理,如果请求通过就会被传递给下一个处理,不通过就会返回相应的 HTTP 响应。

这种机制使得我们很容易在请求最终到达应用代码前添加处理操作,当然如果不需要这个处理操作你也可以随时移除而不影响请求的生命周期。

阅读全文 »

深入理解Apache

发表于 2017-12-01

MPM(Multi-Processing Modules)

MPM翻译过来就是并发处理模块,Apache的MPM有prefork、worker、event等多种模式

1
2
3
4
5
6
7
8
#查看当前apache使用模式
apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
prefork.c # 在此使用prefork模式
阅读全文 »
1…242526…29
Mu

Mu

230 日志
53 标签
© 2021 Mu
由 Hexo 强力驱动
主题 - NexT.Pisces