目录
曾经对TCP/IP报文的一些疑惑1. Appl首部2. 以太网首部和尾部3. MTU是否包含以太网头部和尾部
曾经对三次握手的一些疑惑1. 三次握手只有TCP协议参与?2. 在三次握手期间是否传递数据3. TCP协议的seq numbner和ack number赋值逻辑
最后形成的帧在网络中是如何传递的1. 内网之间的帧传递2. 非内网设备之间的帧传递3. 疑问
参考链接
最近不知道怎么回事跟网络干上了,就是想弄明白数据在网络中到底是怎么传输虽然想这些问题想的脑袋疼,但随着思考的深入离真相越来越近,对这些问题也越来越清晰。 为了不让千千万的脑细胞白白牺牲,就在此做个记录方便以后悼念他们。
曾经对TCP/IP报文的一些疑惑
TCP和IP的的报文在此就不再多说了,主要记录一下对于上图曾经有过的疑惑。
1. Appl首部
就是指http协议的头部,它应该不需要多说了吧
2. 以太网首部和尾部
首部:共14字节 = 6个字节目的地址(目的设备mac地址) + 6个字节源地址(目的设备mac地址) + 2个字节类型(后面所跟数据包的类型,0x0800代表是IP协议帧)尾部:4个字节,用于校验帧的完整性
3. MTU是否包含以太网头部和尾部
不包含
曾经对三次握手的一些疑惑
1. 三次握手只有TCP协议参与?
每次提到三次握手都只是在说TCP协议,慢慢的让我陷入一个误区:三次握手只有TCP协议参与。但后来慢慢接触后才了解,之所以每次提三次握手都只提TCP协议,只不过是因为在三次握手过程中是通过TCP协议的SYN/ACK等字段来判定建立连接的情况,所以会比较关注,其他协议在三次过程中并没有什么特别之处,便没有提及。
2. 在三次握手期间是否传递数据
带有SYN标志的过程是不可以携带数据的,也就是说三次握手的前两次是不可以携带数据的(逻辑上看,连接还没建立,携带数据好像也有点说不过去),但建立连接的第三次握手允许携带数据。
3. TCP协议的seq numbner和ack number赋值逻辑
这两个字段在三次握手过程和数据传输过程赋值逻辑是不一致的。
三次握手过程 在建立连接时,发送端会生成随机的seq number发送给接收端,并且接收端通过将seq number+1赋值给为ack向发送端作响应,代表已经收到发送端的信息。
数据传输过程 数据传输过程用到的初始seq其实就是三次握手结束后的seq,并没有重新生成。接收端对发送端的响应ack不再是seq number+1,而是seq number+数据长度,代表着接收端下次想要数据的起始序号,起始序号仅仅代表着开始,所以接收端还会响应一个window字段,来表示我目前可以接收多的数据,起始序号加上+window,发送端便可以得到此时接收端想要的完整数据。
最后形成的帧在网络中是如何传递的
流程如上图(源于网上-侵删)。另外由于NAT协议的存在,IP地址的变化要分如下两种情况,
1. 内网之间的帧传递
A给B发送消息,IP协议中的IP地址是内网IP,其次通过ARP协议得知两台设备的MAC地址并补充到帧的以太网首部。从而实现两台设备的通信
2. 非内网设备之间的帧传递
A给B发送消息,首先会将帧传递给内网网关C,此时IP协议的源IP地址还都是内网IP,但当继续转发到外网网关C时,源IP地址就会变成A的外网IP,之后的传输中该帧中的源IP地址将一直保持A的外网IP在路由转发过程中,源MAC地址和目标MAC地址是不断变化的。举个栗子,路由中间经过路由M->路由N,该帧的源MAC地址就是路由M的MAC地址,目标MAC地址就是路由N的MAC地址
3. 疑问
路由器是如何知道下一个路由器的MAC地址呢?
两个路由器直接肯定有同个网段的互联地址,下一个路由器的MAC地址同样通过ARP地址解析而来!
参考链接
TCP重发机制ack Num与seq Num计算方法TCP滑动窗口