专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 编程

纵谈TCP/IP

发布时间:2011-07-01 07:30:51 文章来源:www.iduyao.cn 采编人员:星星草
漫谈TCP/IP
这段时间,从同学那儿见识了 启明星辰的笔试题,发现自己自己在网络协议方面的基础
还很薄弱,于是拿出书厚读一番,然后又狗狗了一番,在此沉淀一下,有好有坏,大家尽管指正。

1.tcp的基础:三次握手+4次分手
握手简言之:SYN;ACK,SYN;ACK; //用红色表示被动端,这里表示服务器端
分手简言之: FIN;ACK; FIN; ACK; //用红色表示被动关闭端,这里发起关闭可以是服务器,也可以是客服端。

1.5 换个角度看tcp握手和分手

Q:握手中,最后一次ACK可以缺少吗?
A:等价于问最后一次ACK的意义。
只有服务器端收到ACK ,才能表示客服端准备好了。
如果服务器接收不到ACK,会导致让服务器超时重发SYN.

Q:分手中,被动端回复ACK 和 被动端发送FIN可以合并吗?(或者说分手中第二步与第三步可以合并)
A:当然不能啊,关闭是双向逐渐关闭的。
前面回复ACK表示,我认可你(主动端)不发送消息了。
但是 自己(被动端)可能还有消息要发送,只有自己确认没有消息发送了(应用层体现为close()系统调用),被动端才发送FIN。

Q:分手中,最后一次ACK可以缺少吗?
A:不能。最后一次ACK表示 被动端也不发送数据了。
如果主动端没有收到这个ACK,将会重发SYN报文;多次重发报文后超时后,将会发送RST报文。

Q: 关闭过程中,可以不要TIME_WAIT状态吗?
A:等价于问TIME_WAIT的意义。
用于接收重发的 来自被动端的ACK.

Q:关闭过程中,最后要等待2*MSL时间,为什么?
A: 让冗余的报文在网络中消失,避免序列号回绕。


2.tcp/ip的数据结构基础:头部
主要参考链接:《TCP/IP协议头部结构体》
<http://www.cnblogs.com/dubingsky/archive/2010/01/21/1653650.html> 
我的理解如下:

第一,从数字上了解各个头部的长度(没有扩展前提),以太网有14字节,ip头部是20字节,tcp头部是
  20字节,udp只有8字节。这样就可以计算单个tcp包的最大荷载(即65535-14-20-20),单个udp包的最大荷载(即65535-14-20-8)
第二,了解头部的意义,知道头部里关键字段的布局。
拿tcp头部来说,顺着字节顺序看,目的端口,源端口,顺序号,回复号,标志位,窗口大小等等。

第三,要知晓ip分包的关键字段
这里重复一下参考链接中的解释,我认为比较重要哈。
和IPv4数据报分片相关的Field:
首先接受为何要分片,以太网规定网络间传输的MTU为1500个字节,超过1500个字节的IP报就需要被分片; 此外不同的链路层(TokenRing,FDDI…)规定的MTU值是不同的,在一个IP报从源地址送到目的地的过程中可能需要经过各种不同的网络,所以即使在以太网里面不分片,在其他网络里面可能被分片。
·Identification:源主机每发出一个数据包就会为该数据包分配一个唯一的Identification值,通常是依次递增的方式分配;加入IP报在某个路由上需要分片,则Identification会被复制到每一个分片的IP头中。
·Flags:一共有三个bit,第一个bit目前不用,始终为0;第二个bit为0表示允许分片;为1表示不允许分片;第三个bit为0表示这是最后一个IP报分片,为1表示后面还有更多的IP报分片;
·FragementOffset:表示该分片距离原始IP数据包的偏移字节数;
·TotalLength:IP报被分片后,该值需要被更新为新分片的总长度;


最后,大小端对于tcp等数据结构的定义有什么影响。


3.中级话题:tcp的状态机 
  先简单开个头,tcp状态中有11个,特别的,关闭状态有5个。
关于状态机有精彩的图示,请见:
《TCP状态图和常见问题》
<http://www.cnblogs.com/zhenjing/archive/2011/04/20/2021791.html> 




4.高级话题
由于项目经验所限,以下话题大多是网上涉猎,加上自己的阅读笔记而已(后面补上)。
  希望有相关项目经历的网友给予补充,有要点,有相关精彩的连接都可以。

4.高级话题之减少time_wait的进程数目
预防方法有:减少同一端口的重用。
这个不是很清楚,待补充。

4.高级话题之tcp io model
常见有select ,epoll等。
详细见stevens的经典书UNP

4.高级话题之理解ddos 攻击 和防御ddos
简言之,利用了3次握手的弱点,第三步让发起端不回复ack. 如此发起海量tcp连接,让服务器
  耗费大量资源来维持未建联队列。
知道了原理,就要预防,方案之一有:利用cookie,
参考于一个技术性故事文章:
《黑客张大民之大民治水——DDOS反击浅谈 》

源文档 <http://www.hackbase.com/tech/2009-03-16/51642_2.html> 



4.高级话题之海量tcp连接思考
详细见 淘宝核心系统团队博客 


其他话题有:tcp阻塞后的返回值等等
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: