一点唠叨,感觉学习编程就像一个坑,要进这个坑的们还挺难,进来了之后更加会发现这是一个无底的坑。喜欢的人会在这掉进去的一路上看到一路上繁星般闪亮的别人的智慧,并尽情的吸收学习,让自己的也发光发亮。不喜欢的人会不断的感到绝望和没有未来。

   看了《Spring3.x 企业开发宝典》之后,想看看Spring的源码。看了写Spring的Web模块的源码。好奇对Http的Request和Response以及服务器自身充满了好奇。于是开始看《Http权威指南》。还顺道了解了下CGI,体验了把Tomcat怎么弄个CIG,发现用Java比较难搞,决定用下脚本。前段时间看过点Python,于是在电脑中安装了个Python。一个Demo搭建上去,Python运行出错了。有顺道看了半天的perl。

   做了个竞赛的题目,被打击了一下,决定没事儿做做ACM的题目。一个算法运行时间过长,在老公公的指导下找到的方向是矩阵。于是又回过头去复习原来以为以后永远都不会再碰的线性代数。

  一个坑、两个坑、三个坑…..

进入正题:

   几乎所有的Http都是由TCP/IP承载的。

**TCP简介

 **  TCP书链路层的协议,TCP是可靠的数据传输协议,其可靠性依赖于TCP的传输规则。TCP是分段的,由IP分组传送。TCP的分段及IP数据包明细等,见网络书籍。

TCP三次握手

  • 客户端发送一个小的数据包给服务端,并设置SYN标记,表明请求建立连接
  • 服务端接收到客户端的请求,设置ACK标记,与SYN标记一起发一个响应数据包给客户端,表示可以建立连接
  • 客户端向服务端回送一条确认信息,连接建立,此确认数据分组的报文体部分可以包含将要传输的数据。

TCP四次挥手

  • 客户端发送一个数据包,并用FIN标记告诉服务端,客户端数据传送完毕,关闭自己的输出流
  • 服务端相应一个ACK标记,表示确认
  • 服务端发送完所有的数据,发送客户端确认报文,并用FIN标记告诉客户端,服务端数据发送完毕,关闭自己的输出流
  • 客户端发送确认数据包,并设置ACK标记

注:1. 四次挥手结束之后,服务端的连接不会被立马回收,而是有一个2MLS,一般为2分钟。用来避免在相同地址和相同的端口号上,在短短的2分钟时间之内重新建立连接。2.TCP四次挥手中的蓝色标记的问题,是我个人的理解,并没有得到考证。不过一个套接字关闭自己的输出流,总是安全的

TCP延迟确认

   每个TCP端都有一个序号和校验和,接收端完整的接收到一个TCP段之后要在确定的窗口时间内,向发送端发送一个确认信息。如果在发送端没能在确定的窗口时间之内接收到来自接收端的确认信息,就认为TCP段被损坏或者丢失,就会重发相应数据段。

Negal算法

   如果用TCP发大量的只包含少量数据的分组,会对网络性能造成严重的影响。Negal算法试图将大量小的数据分组绑定在一个TCP段中发送。

   Negal算法会先发送全尺寸的TCP数据包。只有在前面传输的所有数据包都得到确认之后,Negal算法才允许发送非全尺寸的数据包,否则就等到组合为一个全尺寸的数据包之后再发送。

   Negal算法的延时:Negal算法的使用会导致有些小的数据包要等交久之后才能被发送。加上TCP的延迟确认,会让部分数据包要等到前面所有发送出去的数据包都得到确认之后才能被发送。