#因为想更好的理解数据在传输过程中在各层上的情况,所以就有了此篇,如果错误,还请指正~
数据在传输过程大致是以下这个图片这样:
然后我们来细说一下
1. 首先在应用层,客户机要访问目的主机的某个应用程序就会要求对方打开对应的固定端口,而此时客户机也会主动打开一个大于1024的随机端口用来和目的主机通信。加上应用层首部,就比如说,telnet,FTP等等。下面是数据到达网络层的样子:
2. 到了运输层,上面的整体又会加上TCP首部,TCP的首部格式是这样的。
但是这个运输层报文不会这样直接到网络层的,此时要建立TCP三次握手,建立完成后才会传输数据(第三次握手可携带数据)。以下为TCP三次握手过程:
这个过程本来我是有一个疑问的,ACK只占一位,为什么可以ack=x+1,然后我抓包(telnet过程)看了一下,
上面的ack代表的是acknowledgment number,如下:
tcp在发送包的时候到了数据链路层需要封装成帧,所以会在网络层发送ARP包寻找目的mac地址,这时候分为同一网段和不同网段:
同一网段:
先查看ARP地址缓存表,如果没有主机B的mac地址,则主机A发送广播的ARP请求包,在本局域网内所有运行的主机都会收到此ARP包,对比目的ip地址找到主机B,主机B收到后会把自己的mac地址写进去然后回复主机A(单播)
不同网段:
首先查看ARP地址缓存表是否有网关的mac地址,没有的话发送广播包获得,获得后直接把数据包发送给网关,网关会进行转发,目的mac地址为网关的,源mac是自己,源ip是自己,目的ip是主机B
继续介绍TCP三次握手(以下来自谢希仁版的计算机网络)
一开始,服务器的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN (收听)状态,等待客户的连接请求。如有,即作出响应。
客户的TCP客户进程也是首先创建传输控制模块TCB。然后,在打算建立TCP连接时,向server发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq =x。TCP规定,SYN报文段(即SYN= 1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT (同步已发送)状态。
服务器收到连接请求报文段后,如同意建立连接,则向客户发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+ 1,同时也为自己选择一个初始序号 seq= y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD (同步收到)状态。
TCP客户进程收到服务器的确认后,还要向服务器给出确认。确认报文段的ACK置1,确认号ack=y+ 1,而自己的序seq=x+1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+ 1。这时,TCP连接已经建立,客户进入ESTABLISHED (已建立连接)状态。
当服务器收到客户的确认后,也进入ESTABLISHED状态。
当tcp完成三次握手后,再开始进行数据传输(这里不介绍三次握手在各层上的情况,直接到三次握手结束后的事情)
下面为数据到了网络层的样子
3. 到了网络层,上面的整体又会加上ip的首部,ip的首部格式如下:
数据包到了数据链路层变成以下这样:
4. 到了数据链路层,会加上链路层首部和尾部,下图为帧的格式:
数据到物理层是这样的:
5. 到了主机B那里的各层就一步步把首部和尾部去掉就可以了,这里就不详细说明了。
6. 这里我想说一下数据传输完成后,TCP断开连接的四次挥手。首先四次挥手的过程如下:(这里借用一下书中的图吧,实在不想画了😭)
这里抓了一个包来看是一样的
不过有一个地方很奇怪,正常来说第一次应该是A只发送FIN,为什么还有ACK呢,书中是这样说的(TCP-IP详解卷1,P172页)
四次挥手大致过程如下:
A告诉B,我没有数据要传送了,我想断开连接了,于是给B发了一个FIN(finish-结束);
这时候B收到了,给A发了一个ACK表示确认,我收到你的请求了,但是我还有数据没传送完,所以不直接发送FIN结束连接;
当B也没有数据要发送的时候,给A也发了FIN,告诉A想结束了;
A收到后,最后发送一个ACK表示确认,但A需要等待2MSL的时间才能关闭,MSL代表:一个报文段最大生存时间。
等待2MSL一个原因是:为了保证A发送的最后一个ACK报文段能够到达B,
第二是防止“已失效的连接请求报文段”出现在本连接中:A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
(这里不详细解释,等完全弄懂后,会写一篇关于TCP连接和释放中的问题)