1,真正负责设备间传输的是网络层和数据链路层;
2,分工会带来很多好处,因为每个人都可以专注于自己擅长的领域,更好地服务他人;
3,网络分层的目的并不仅仅是完成任务,而是要用最好的方式来完成;
4,网络包是有大小限制的,其最大值称为MTU,即最大传输单元。大多数网络的MTU是1500Byte,但也有些网络启用了巨帧(Jumbo Frame),能达到9000Byte。一个8000Byte的包进入巨帧网络是没有问题的,但进入1500Byte的网络就会被丢弃或者切分。被丢弃意味着意味着传输彻底失败,因为重传的包还是会被丢弃。而被切分则意味着传输效率降低;
5,OSI七层模型和TCP/IP模型;
6,TCP提供有序的传输,所以每个数据段都要标上一个序列号(Seq)。当接收方收到乱序的包时,有了这个序号就可以重新排序了;
7,一个Seq号的大小是根据上一个数据段的Seq+Len得来的,注意Len不包括TCP头部;
8,由于TCP是双向的,在一个连接中双方都可以是发送方,所以各自维护了一个Seq号;
9,Ack确认号,确认已经收到了哪些字节。理论上,接收方回复的Ack号恰好等于发送方的下一个Seq号;
10,TCP的确认是可以累积的;
11,当包乱序时,接收方只要根据Seq号从小到大重新排序就好,这样保证了TCP的有序性。再比如有包丢失的时候,接收方通过前一个Seq+Len的值与下一个Seq的差,就能判断缺了哪些包,这保证了TCP的可靠性;
12,TCP头常见的几个标志位:
SYN:携带这个标志的包表示正在发起连接请求,因为连接是双向的,所以建立连接时,双方都要发一个SYN;
FIN:携带这个标志的包表示正在请求终止连接。因为连接是双向的,所以彻底关闭一个连接时,双方都要发一个SYN;
RST:用于重置一个混乱的连接,或者拒绝一个无效的请求。
#如果你在一个Wireshark钟看到一个RST包,务必睁大眼睛好好检查。
13,TCP三次握手过程:
C:我能跟你建立连接吗?我的初始发送序号是X。如果你答应就Ack=X+1;
S:收到啦,Ack=X+1。我也想跟你建立连接,我的初始发送序号是Y,你如果答应就回复Ack=Y+1;
C:收到了,Ack=Y+1。
14,TCP四次挥手过程:
C:我希望断开连接(请注意FIN标志);
S:知道了,断开吧;
S:我这边的连接也想断开(请注意FIN标志);
C:知道了,断开吧。
15,快递送货的策略是非常浅显的,几乎人人可以理解。而TCP传输大块数据的策略却很少有人懂。事实上这两者原理是相似的:
假如发一个包就停下来等待确认,这样一个往返时间内就只能传输一个包,这样的传输效率太低了;
最快的方式是一口气把所有的包发送出去,然后一起确认。但现实存在很多限制,接收方的缓存(接受窗口)可能一下接收不了这么多数据、网络带宽也不够大容易导致丢包。
所以,发送方要知道接收方的接收窗口和网络这两个限制因素中哪一个更为严格,然后在其限制范围内尽可能多发包。这个一口气能发送的数据量就是传说中的TCP发送窗口。
TCP层里面window size不是发送窗口,而是再向对方声明自己的接收窗口。滑动窗口机制,就是接收方向发送方声明自己的接收窗口大小,然后发送方修改自己的发送窗口,说的就是这两个窗口的关系。
发送窗口是由接收窗口决定的!只要在包里用“win=”告知发送方即可;
假如接收方处理数据的速度跟不上接收数据的速度,缓存就会被占满,从而导致接收窗口为0。意味那段时间内发不出数据。
网络之所以限制发送窗口,是因为它一口气受到太多数据时就会拥塞,拥塞的结果是丢包,这是发送方最忌惮的。能导致网络拥塞的数据量称为拥塞点。发送发当然希望把发送窗口控制在拥塞点下以避免拥塞。
由于UDP协议头长度还不到TCP头的一半,所以在同样大小的包里,UDP携带的净数据比TCP包多一些;
由于UDP没有Seq号和Ack号等概念,无法维持一个连接,所以省去了建立连接的负担。这个优势在DNS查询中体现的淋漓尽致;