Linux Socket 编程简介和实现

  categories:资料  author:

这篇文章主要介绍了Linux Socket 编程简介和实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在 TCP/IP 协议中,”IP地址 + TCP或UDP端口号” 可以唯一标识网络通讯中的一个进程,”IP地址+端口号” 就称为 socket。本文以一个简单的 TCP 协议为例,介绍如何创建基于 TCP 协议的网络程序。

TCP 协议通讯流程

下图描述了 TCP 协议的通讯流程(此图来自互联网):

1

下图则描述 TCP 建立连接的过程(此图来自互联网):

服务器调用 socket()、bind()、listen() 函数完成初始化后,调用 accept() 阻塞等待,处于监听端口的状态,客户端调用 socket() 初始化后,调用 connect() 发出 SYN 段并阻塞等待服务器应答,服务器应答一个SYN-ACK 段,客户端收到后从 connect() 返回,同时应答一个 ACK 段,服务器收到后从 accept()

阅读全文

浅谈 Linux C语言 socket 网络编程

  categories:资料  author:

Linux C语言socket网络编程


注意:本文是按照 TCP、UDP的工作过程进行总结的

  1. TCP套 socket 接口编程:基于TCP的 客户/服务器(C/S)模式的工作过程如下:

服务器进程中的一些函数:


  1. socket():
    /*  函数所需头文件及其原型 */
    #include <sys/socket.h>
    int socket( int family, int type, int protocol);
    socketfd = soket(AF_INET, SOCK_STREAM, 0);
    /*  socketfd 作为返回值,可以记作描述符。
     若 socketfd 非负则表示成功,为负则表示失败。
     
阅读全文

mybatis中关于example类

  categories:资料  author:

这几天刚接触example,很多内容都是破碎的,写一篇文章加深理解。

一、什么是example类

mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。具体配置可以参考 Mybatis-Generator的具体使用方法 – zorro的菜鸟笔记 – 博客园。

参考资料:http://www.mybatis.org/mybatis-dynamic-sql/docs/introduction.html

下面是mybatis自动生成example的使用。

二、了解example成员变量

 //作用:升序还是降序
 //参数格式:字段+空格+asc(desc)
 protected String orderByClause;  
 //作用:去除重复
 //true是选择不重复记录,false,反之
 protected boolean distinct;
 //自定义查询条件
 //Criteria的集合,集合中对象是由or连接
 protected List<Criteria> oredCriteria;
 //内部类Criteria包含一个Cretiron的集合,
 //每一个Criteria对象内包含的Cretiron之间是由  AND连接的
 public static class Criteria
阅读全文

Mybatis动态sql语句

  categories:资料  author:

1、MyBatis中#{ }和${ }的区别

在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${},他们都可以用来动态传递参数,补全SQL语句。

#{“参数名”}在SQL中相当于一个参数占位符“?”,用来补全预编译语句。它补全预编译语句时,可以理解为在此参数值两端加了单引号。举例如下,当需要动态的按id查询用户信息时。

select * from my_user where id = #{id};
如果我们为id赋值为1,这条SQL执行效果相当于下面的SQL。

select * from my_user where id = ‘1’;
由于预编译SQL使用PreparedStatement对象抽象预编译语句,之后使用也无需再次编译,而且能够防止注入式攻击。所以,虽然这时候两种方式得到相同的结果,但是只要能够使用#{ }解决,我们都应该使用#{ }。

${“参数名”}就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低,也无法复用。但是在有些#{ }无法胜任的地方,还是会需要${ }来完成。比如当SQL中数据库表名为参数时,如果使用#{ },如下所示。

阅读全文

Wireshark使用教程

  categories:资料  author:

抓取报文:

  下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包。例如,如果想要在无线网络上抓取流量,点击无线接口。点击Capture Options可以配置高级属性,但现在无此必要。

点击接口名称之后,就可以看到实时接收的报文。Wireshark会捕捉系统发送和接收的每一个报文。如果抓取的接口是无线并且选项选取的是混合模式,那么也会看到网络上其他报文。

上端面板每一行对应一个网络报文,默认显示报文接收时间(相对开始抓取的时间点),源和目标IP地址,使用协议和报文相关信息。点击某一行可以在下面两个窗口看到更多信息。“+”图标显示报文里面每一层的详细信息。底端窗口同时以十六进制和ASCII码的方式列出报文内容。

需要停止抓取报文的时候,点击左上角的停止按键。

色彩标识:

进行到这里已经看到报文以绿色,蓝色,黑色显示出来。Wireshark通过颜色让各种流量的报文一目了然。比如默认绿色是TCP报文,深蓝色是DNS,浅蓝是UDP,黑色标识出有问题的TCP报文——比如乱序报文。

报文样本:

比如说你在家安装了Wireshark,但家用LAN环境下没有感兴趣的报文可供观察,那么可以去Wireshark wiki下载报文样本文件。

打开一个抓取文件相当简单,在主界面上点击Open并浏览文件即可。也可以在Wireshark里保存自己的抓包文件并稍后打开。

过滤报文:

如果正在尝试分析问题,比如打电话的时候某一程序发送的报文,可以关闭所有其他使用网络的应用来减少流量。但还是可能有大批报文需要筛选,这时要用到Wireshark过滤器。

最基本的方式就是在窗口顶端过滤栏输入并点击Apply(或按下回车)。例如,输入“dns”就会只看到DNS报文。输入的时候,Wireshark会帮助自动完成过滤条件。

也可以点击Analyze菜单并选择Display Filters来创建新的过滤条件。

另一件很有趣的事情是你可以右键报文并选择Follow TCP Stream。

你会看到在服务器和目标端之间的全部会话。

关闭窗口之后,你会发现过滤条件自动被引用了——Wireshark显示构成会话的报文。

检查报文:

选中一个报文之后,就可以深入挖掘它的内容了。

也可以在这里创建过滤条件——只需右键细节并使用Apply as Filter子菜单,就可以根据此细节创建过滤条件。

Wireshark是一个非常之强大的工具,第一节只介绍它的最基本用法。网络专家用它来debug网络协议实现细节,检查安全问题,网络协议内部构件等等。

一站式学习Wireshark(二):应用Wireshark观察基本网络协议

TCP:

TCP/IP通过三次握手建立一个连接。这一过程中的三种报文是:SYN,SYN/ACK,ACK。

第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了TCP三次握手的开始。

如果你找不到第一个SYN报文,选择Edit -> Find Packet菜单选项。选择Display Filter,输入过滤条件:tcp.flags,这时会看到一个flag列表用于选择。选择合适的flag,tcp.flags.syn并且加上==1。点击Find,之后trace中的第一个SYN报文就会高亮出来了。

注意:Find

阅读全文

Java 四种线程池

  categories:资料  author:

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。

1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?

new Thread(new Runnable() {
 
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();

那你就out太多了,new Thread的弊端如下:

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

阅读全文

k8s1.6伸缩性升级,支持处理5000 Node 和 15 万个 Pod

  categories:资料  author:

上个夏天,我们分享了 Kubernetes 的伸缩性更新,经过一番努力,我们自豪的宣布 Kubernetes 1.6 能够处理 5000 个节点的集群和 15 万个 Pod 了;另外即使在这种负载规模下,端到端的 Pod 启动速度依然优于 2000 节点规模的 1.3 版本的 Kubernetes 集群,API 调用的延迟依然满足 1 秒的 SLO。

本文中我们会讨论到

  • 性能测试的指标和结果
  • 提高性能的改进
  • 未来在伸缩性方面的发展计划

XX 节点的集群意味着什么?

现在 Kubernetes 1.6 已经发布,那么当我们说到支持多少个节点的集群的时候,我们到底在说什么?前文说过,我们有两个性能相关的服务水平目标(SLO):

  • API 响应性:99% 的 API 调用应该在一秒之内返回。
  • Pod
阅读全文

TCP滑动窗口控制流量的原理

  categories:资料  author:

TCP提供一种面向连接的、可靠的字节流服务

(参考网站:

https://coolshell.cn/articles/11609.html

https://github.com/steveLauwh/TCP-IP/blob/master/TCP/TCP%20Sliding%20Window.md

https://wizardforcel.gitbooks.io/network-basic/7.html  非常好的   文章列表, 非常好的 图解

http://www.52im.net/thread-515-1-1.html     非常好的   文章列表, 非常好的 图解

 

一、可靠传输的要求
可靠的传输应该满足下面两个要求:
(1)传输的信道不产生差错;
(2)保证传输数据的正确性,无差错、不丢失、不重复、并且按序到达。
这里有两层意思,一是能够正确地传输数据,二是接收方能够及时处理发送方发送的数据。二、可靠传输的工作原理
TCP为了提供可靠传输:
(1)首先,采用三次握手来建立TCP连接,四次握手来释放TCP连接,从而保证建立的传输信道是可靠的。
(2)其次,TCP采用了超时重传来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及时处理所接收到的数据,进行流量控制。
(3)最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞。
1、超时重传 
发送一个报文段,会立即启动一个重传计时器,等待目的端口确认收到这个数据段。否则将超时重传。
2、确认响应 
对于一个收到的请求,将发送一个确认。这个确认通常要延迟几分之一秒。
3、首部校验 
TCP数据报文段中有收和数据的校验和。这是一个端到端的校验和。如果出错的话,则接收端不会发送确认,从而触发发送方的确认重传。
4、对收到的数据进行排序。 
由于IP数据报文在网络中经历的时间可能不一样,所以数据到达接收端可能会失序。而接收方的传输层会根据报文段中的序号,进行重新排序。
5、重复的而数据直接丢弃。
6、流量控制 
TCP可以通过窗口大小来进行流量控制,防止接收慢的主机缓冲区溢出。
阅读全文

使用Logstash收集Kubernetes的应用日志

  categories:资料  author:

 前言

本文同步更新到Github仓库kubernetes-handbook中。很多企业内部都有自己的ElasticSearch集群,我们没有必要在kubernetes集群内部再部署一个,而且这样还难于管理,因此我们考虑在容器里部署logstash收集日志到已有的ElasticSearch集群中。

方案选择

Kubernetes官方提供了EFK的日志收集解决方案,但是这种方案并不适合所有的业务场景,它本身就有一些局限性,例如:

  • 所有日志都必须是out前台输出,真实业务场景中无法保证所有日志都在前台输出
  • 只能有一个日志输出文件,而真实业务场景中往往有多个日志输出文件
  • Fluentd并不是常用的日志收集工具,我们更习惯用logstash
  • 我们已经有自己的ELK集群且有专人维护,没有必要再在kubernetes上做一个日志收集服务

基于以上几个原因,我们决定使用自己的ELK集群。

Kubernetes集群中的日志收集解决方案

编号 方案 优点 缺点
1 每个app的镜像中都集成日志收集组件 部署方便,kubernetes的yaml文件无须特别配置,可以为每个app自定义日志收集配置 强耦合,不方便应用和日志收集组件升级和维护且会导致镜像过大
2 单独创建一个日志收集组件跟app的容器一起运行在同一个pod中 低耦合,扩展性强,方便维护和升级 需要对kubernetes的yaml文件进行单独配置,略显繁琐
3 将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志收集Pod 完全解耦,性能最高,管理起来最方便 需要统一日志收集规则,目录和输出方式

综合以上优缺点,我们选择使用方案二。

该方案在扩展性、个性化、部署和后期维护方面都能做到均衡,因此选择该方案。

20170516222039

我们创建了自己的logstash镜像。创建过程和使用方式见https://github.com/rootsongjc/docker-images

镜像地址:index.tenxcloud.com/jimmy/logstash:5.3.0

测试

我们部署一个应用对logstash的日志收集功能进行测试。

创建应用yaml文件logstash-test.yaml

apiVersion: extensions/
阅读全文

如何在Kubernetes上玩转TensorFlow

  categories:资料  author:

女主宣言

该文章出自于ADDOPS团队,是关于如何在K8S上玩转tensorflow的主题,该文章深入浅出的给我们介绍了当前tensorflow的现状和架构特点等,然后介绍了让tensorflow如何基于k8s快速落地,让大家都能简单的上手tensorflow,整体文章脉络清晰,内容适度,所以希望能给大家带来启发。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

Tensorflow作为深度学习领域逐渐成熟的项目,以其支持多种开发语言,支持多种异构平台,提供强大的算法模型,被越来越多的开发者使用。但在使用的过程中,尤其是GPU集群的时候,我们或多或少将面临以下问题:

  • 资源隔离。Tensorflow(以下简称tf)中并没有租户的概念,何如在集群中建立租户的概念,做到资源的有效隔离成为比较重要的问题;
  • 缺乏GPU调度。tf通过指定GPU的编号来实现GPU的调度,这样容易造成集群的GPU负载不均衡;
  • 进程遗留问题。tf的分布式模式ps服务器会出现tf进程遗留问题;
  • 训练的数据分发以及训练模型保存,都需要人工介入;
  • 训练日志保存、查看不方便;

因此,我们需要一个集群调度和管理系统,可以解决GPU调度、资源隔离、统一的作业管理和跟踪等问题。

目前,社区中有多种开源项目可以解决类似的问题,比如yarn,kubernetes。yarn是hadoop生态中的资源管理系统,而kubernetes(以下简称k8s)作为Google开源的容器集群管理系统,在tf1.6版本加入GPU管理后,已经成为很好的tf任务的统一调度和管理系统。

下文是我们公司在tensorflow on kubernetes方面的实践经验。

设计目标

我们将tensorflow引入k8s,可以利用其本身的机制解决资源隔离,GPU调度以及进程遗留的问题。除此之外,我们还需要面临下面问题的挑战:

  • 支持单机和分布式的tensorflow任务;
  • 分布式的tf程序不再需要手动配置clusterspec信息,只需要指定worker和ps的数目,能自动生成clusterspec信息;
  • 训练数据、训练模型以及日志不会因为容器销毁而丢失,可以统一保存;

为了解决上面的问题,我们开发了tensorflow on kubernetes系统。

架构

tensorflow on kubernetes包含三个主要的部分,分别是client、task和autospec模块。client模块负责接收用户创建任务的请求,并将任务发送给task模块。task模块根据任务的类型(单机模式和分布式模式)来确定接下来的流程:

如果type选择的是single(单机模式),对应的是tf中的单机任务,则按照按照用户提交的配额来启动container并完成最终的任务;

如果type选择的是distribute(分布式模式),对应的是tf的分布式任务,则按照分布式模式来执行任务。需要注意的是,在分布式模式中会涉及到生成clusterspec信息,autospec模块负责自动生成clusterspec信息,减少人工干预。

下面是tensorflow on kubernetes的架构图:

接下来将对三个模块进行重点介绍。

client模块

tshell

在容器中执行任务的时候,我们可以通过三种方式获取执行任务的代码和训练需要的数据:

  • 将代码和数据做成新的镜像;
  • 将代码和数据通过卷的形式挂载到容器中;
  • 从存储系统中获取代码和数据;

前两种方式不太适合用户经常修改代码的场景,最后一种场景可以解决修改代码的问题,但是它也有下拉代码和数据需要时间的缺点。综合考虑后,我们采取第三种方式。

阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1