简单,可复制

点点滴滴,尽在文中

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  网络

摘要:A. IntroductionThis document provides a brief overview of how TCP isimplemented in Linux.It is not meant to be comprehensive,nor do we assert that it is without inaccuracies.B. TCP implementation in LinuxFigures 1 and 2 show the internals of the TCP implementation in Linux kernel. Fig. 1 shows the p 阅读全文
posted @ 2012-11-01 20:00 ggjucheng 阅读(7516) 评论(0) 推荐(0) 编辑

摘要:前言socket选项主要是由setsockopt和getsockopt函数完成的,这里主要是记录我自己常用的一些socket选项。函数原型int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);实用例子设置socket套接字可以复用地址i... 阅读全文
posted @ 2012-02-17 15:19 ggjucheng 阅读(3370) 评论(0) 推荐(3) 编辑

摘要:前言 在项目中,需要用到判断主机是否可以ping,于是在网上找到了使用C语言的ping源码,但是难以复用,并加以改善:加入超时处理,容错处理,以C++类的封装性,调用更加简单。 本代码在ubuntu和freebsd上测试均都通过,理论上兼容Linux和Unix源代码简介 源代码分为三个文件:ping.h ping.cpp main.cpp,其中ping.h和ping.cpp提供了Ping类的操作,main.cpp是使用Ping类的使用例子,已经使用Ping类写了一个简单的ping程序。把Ping的输出移到了main.cpp,所以输出集中在main.cpp,主要的ping的逻辑处理在pin... 阅读全文
posted @ 2012-02-17 12:07 ggjucheng 阅读(15324) 评论(1) 推荐(3) 编辑

摘要:拥塞避免算法的修改建议1 9 9 0年提出 [Jacobson 1990b]。在介绍修改之前,我们认识到在收到一个失序的报文段时, TCP立即需要产生一个ACK(一个重复的ACK)。这个重复的ACK不应该被迟延。该重复的ACK的目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。由于我们不知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1 ~ 2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可 阅读全文
posted @ 2012-02-05 20:01 ggjucheng 阅读(11208) 评论(0) 推荐(1) 编辑

摘要:引言TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。超时与重传的简单例子首先观察TCP所使用的重传机制,我们将建立一个连接,发送一些分组来证明一切正常,然后拔掉电缆,发送更多的数据,再观察TCP的行为。下图表示的是tcpdump的输出结果(已经去掉了bsdi设置的服务类型信息)。第1、2和3行表示正常的TCP连接建立的过程,第4行是“hello, world”(1 阅读全文
posted @ 2012-02-05 19:50 ggjucheng 阅读(10437) 评论(0) 推荐(0) 编辑

摘要:引言TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为 0会发生什么情况呢?这将有效地阻止发送方传送数据,直到窗口变为非0为止。TCP不对ACK报文段进行确认, TCP只确认那些包含有数据的ACK报文段。如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查 (window 阅读全文
posted @ 2012-02-05 19:40 ggjucheng 阅读(3969) 评论(3) 推荐(1) 编辑

摘要:拥塞避免算法是一种处理丢失分组的方法。该算法假定由于分组受到损坏引起的丢失是非常少的(远小于1%),因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:发生超时和接收到重复的确认。如果使用超时作为拥塞指示,则需要使用一个好的RTT算法。拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口 cwnd和一个慢启动门限ssthresh。这样得到的算法的工作过程如下:1) 对一个给定的 阅读全文
posted @ 2012-02-03 17:50 ggjucheng 阅读(13173) 评论(0) 推荐(3) 编辑

摘要:什么是糊涂窗口综合症当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小。 极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症发送端引起的糊涂窗口综合症如果发送端为产生数据很慢的应用程序服务(典型的有telnet应用),例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的TCP的缓存。如果发送端的TCP没有特定的指令,它就产生只包括一个字节数据的报文段。结果有很多41字节的IP数据报就在互连网中传来传去。解决的方法是防 阅读全文
posted @ 2012-02-03 14:35 ggjucheng 阅读(5088) 评论(0) 推荐(2) 编辑

摘要:慢启动定义慢启动,是传输控制协议使用的一种阻塞控制机制。慢启动也叫做指数增长期。慢启动是指每次TCP接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。这种情况一直保持到要么没有收到一些段,要么窗口大小到达预先定义的阈值。如果发生丢失事件,TCP就认为这是网络阻塞,就会采取措施减轻网络拥挤。一旦发生丢失事件或者到达阈值,TCP就会进入线性增长阶段。这时,每经过一个RTT窗口增长一个段。慢启动解析发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出 阅读全文
posted @ 2012-02-02 16:57 ggjucheng 阅读(30349) 评论(3) 推荐(5) 编辑

摘要:前言虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲解客户端和服务端的TCP/IP交互细节。TCP/IP协议IP头和TCP头格式如下:Internet Header Format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 ... 阅读全文
posted @ 2012-02-02 11:08 ggjucheng 阅读(18942) 评论(1) 推荐(7) 编辑

摘要:前言本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出服务端代码如下:#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <netinet 阅读全文
posted @ 2012-01-17 19:54 ggjucheng 阅读(29350) 评论(10) 推荐(3) 编辑

摘要:前言本章节是用基本的Linux/Unix基本函数加上poll调用编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出服务端代码如下:#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definiti 阅读全文
posted @ 2012-01-17 19:13 ggjucheng 阅读(7899) 评论(2) 推荐(2) 编辑

摘要:前言本章节是用基本的Linux/Unix基本函数加上select调用编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出服务端代码如下:#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket defini 阅读全文
posted @ 2012-01-17 16:57 ggjucheng 阅读(10281) 评论(3) 推荐(4) 编辑

摘要:前言本章节是用基本的Linux/Unix基本函数编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出服务端代码如下:#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#i 阅读全文
posted @ 2012-01-17 13:54 ggjucheng 阅读(17614) 评论(2) 推荐(0) 编辑

摘要:简介TCP延迟确认是由一些实现采用的技术,努力提高网络性能的传输控制协议 。从本质上讲,几个应答响应可能结合在一起,成一个响应,减少协议开销 。然而,在某些情况下,该技术可以降低应用程序的性能。方法和优势RFC 1122中描述,主机可能延迟发送ACK响应到500毫秒。此外,收到一个完整大小的TCP报文段,就要发送ACK响应 。延迟ACK可以给应用程序的机会,一起发送更新的TCP接收窗口,ACK和应用程序的即时响应。如某些协议,远程登录,通过合并ACK,tcp窗口更新和应用程序的响应为一个报文段,延迟ACK可以减少服务器发送的响应的数据为3倍问题在某些应用程序和配置交互时,延迟ACK引入额外的等 阅读全文
posted @ 2012-01-15 21:50 ggjucheng 阅读(12376) 评论(0) 推荐(0) 编辑

摘要:纳格算法是以减少封包传送量来增进TCP/IP网络的效能。 它是由约翰.纳格任职于Ford Aerospace时命名。纳格的文件,Congestion Control in IP/TCP Internetworks(RFC896) 描述了他所谓的“小封包问题”-某个应用程式不断地送出小单位的资料,且某些常只占1字节大小。 因为TCP封包具有40字节的标头资讯(TCP与IPv4各占20字节),这导致了41字节大小的封包只有1字节的可用资讯,造成庞大的浪费。 这种状况常常发生于Telnet工作阶段-大部分的键盘操作会产生1字节的资料并马上送出。 更糟的是,在慢速的网络连线下,这类的封包会大量地在同一 阅读全文
posted @ 2012-01-15 21:23 ggjucheng 阅读(2870) 评论(0) 推荐(1) 编辑

摘要:Nagle算法的立意是良好的,避免网络中充塞小封包,提高网络的利用率。但是当Nagle算法遇到delayed ACK悲剧就发生了。Delayed ACK的本意也是为了提高TCP性能,跟应答数据捎带上ACK,同时避免糊涂窗口综合症,也可以一个ack确认多个段来节省开销。 悲剧发生在这种情况,假设一端发送数据并等待另一端应答,协议上分为头部和数据,发送的时候不幸地选择了write-write,然后再read,也就是先发送头部,再发送数据,最后等待应答。发送端的伪代码是这样write(head); write(body); read(response);接收端的处理代码类似这样:read(req.. 阅读全文
posted @ 2012-01-15 21:17 ggjucheng 阅读(4793) 评论(0) 推荐(0) 编辑