摘要: TCP有Keepalive功能,它和HTTP的Keepalive功能目的不一样。TCP服务器希望知道客户端是否崩溃、重新启动或者中间路由不通。保活定时器就提供这种功能。 在进一步介绍TCP的保活定时器前,先了解一个概念:长连接和短连接。(TCP是长连接) 长连接:建立一个连接,多个请求复用这个连接, 阅读全文
posted @ 2017-11-24 22:12 guhowo 阅读(530) 评论(0) 推荐(0) 编辑
摘要: TCP提供可靠的传输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没收到确认,他就重传数该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。 TCP管理四个定时 阅读全文
posted @ 2017-11-22 22:56 guhowo 阅读(715) 评论(0) 推荐(0) 编辑
摘要: TCP的交互数据流 呼入连接请求队列 一个并发服务器调用一个新的进程来处理每个客户请求,因此处于被动连接请求的服务器应该始终处理下一个呼入的连接请求。那正是使用并发服务器的根本原因。但是仍有可能当服务器咋爱创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。此时TCP是如何 阅读全文
posted @ 2017-11-19 12:14 guhowo 阅读(937) 评论(0) 推荐(0) 编辑
摘要: 四次挥手 以上过程流程图如下: 为什么断开连接需要四次握手?因为TCP链接是全双工的,即数据在两个方向上能同时传递,因此每个方向必须单独的进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。 分析 TCP报文头中flags中的FIN被置为1,sequence num 阅读全文
posted @ 2017-10-31 23:23 guhowo 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 模拟三次握手 telnet连接虚拟机192.168.0.107。用tcpdump抓包,然后用wireshark分析报文。 以上过程如下图: 分析 上图2,3,4就是三次握手的过程。本地端口号为52368,telnet端口号23。 上面截图就是第一次握手的数据分析,可以清晰的看出TCP报文头的结构: 阅读全文
posted @ 2017-10-30 23:39 guhowo 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 封装性:越少的代码可以看到数据(也就是可以访问它们),越多东西被封装,越少人可以看到它。而越少的人看到它,我们就有愈大的弹性去改变他,因为我们的改变仅仅直接影响看到改变的那些人。例如,class WebBrowser可能拥有大量便利函数,某些与bookmarks书签有关,有些与cookie有关,通常 阅读全文
posted @ 2017-09-07 23:25 guhowo 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋 阅读全文
posted @ 2017-09-05 00:10 guhowo 阅读(917) 评论(0) 推荐(0) 编辑
摘要: 如何禁止对象之间的拷贝? 将构造函数和析构函数中的任意一个设置为private,如下: 编译报错提示:Variable of type 'A' has private destructor. 我们知道,如果我们不显性的声明拷贝构造函数和重载=,那么编译器会为我们提供默认的拷贝构造函数和copy as 阅读全文
posted @ 2017-08-31 00:04 guhowo 阅读(2093) 评论(0) 推荐(0) 编辑
摘要: 构造函数,顾名思义,新构造一个对象。如下调用的就是普通的构造函数: 拷贝构造函数,顾名思义,也是一种构造函数,特殊的构造函数,用一个已存在的对象初始化一个新的对象,就是拷贝构造函数。如下调用的就是拷贝构造函数,用已经存在的string s去初始化新的对象a: 拷贝构造函数声明如下:(以String为 阅读全文
posted @ 2017-08-19 23:34 guhowo 阅读(484) 评论(0) 推荐(0) 编辑