这段时间,从同学那儿见识了 启明星辰的笔试题,发现自己自己在网络协议方面的基础
还很薄弱,于是拿出书厚读一番,然后又狗狗了一番,在此沉淀一下,有好有坏,大家尽管指正。
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协议头部结构体》
我的理解如下:
第一,从数字上了解各个头部的长度(没有扩展前提),以太网有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状态图和常见问题》
4.高级话题
由于项目经验所限,以下话题大多是网上涉猎,加上自己的阅读笔记而已(后面补上)。
希望有相关项目经历的网友给予补充,有要点,有相关精彩的连接都可以。
4.高级话题之减少time_wait的进程数目
预防方法有:减少同一端口的重用。
这个不是很清楚,待补充。
4.高级话题之tcp io model
常见有select ,epoll等。
详细见stevens的经典书UNP
4.高级话题之理解ddos 攻击 和防御ddos
简言之,利用了3次握手的弱点,第三步让发起端不回复ack. 如此发起海量tcp连接,让服务器
耗费大量资源来维持未建联队列。
知道了原理,就要预防,方案之一有:利用cookie,
参考于一个技术性故事文章:
《黑客张大民之大民治水——DDOS反击浅谈 》
其他话题有:tcp阻塞后的返回值等等
漫谈TCP/IP
原创
©著作权归作者所有:来自51CTO博客作者Tody_Guo的原创作品,请联系作者获取转载授权,否则将追究法律责任

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章