计算机网络(一些知识与思考)
1.应用层,首先在应用程序中,只涉及到用户态,在这里我们如果调用其他的接口(有点类似于在网站上输入url),网络库会帮我们解析url请求,解析之后会封装成请求报文。注意这里:这里如果是域名的话,还需要使用DNS域名解析系统将域名对应的ip地址解析出来!
2.传输层,通过socket提供的接口(用户态->内核态),将我们请求报文的数据拷贝到socket的缓冲区中(sk_buff),其实这里是会将数据拷贝一份的(用于后面的消息重传)然后将数据交给协议栈来处理,注意这里,如果两个节点之间没有建立TCP连接的话,这里会先三次握手建立TCP连接。连接之后,会封装TCP包,比如说一些关键属性:源端口号、目标端口号、序列号、确认序列号、标志位(ACK、SYN、FIN、RST等)、滑动窗口(流量控制),注意这里:TCP包中的数据部分有一个最大上限,MSS(最大报文段长度,类似的还有MTU)
3.网络层,封装ip数据报,源ip地址,目的ip地址,这里如果ip数据报的数据部分最大为1MTU(1500字节),超出的话是会分片的!补充一下:如果MTU设计的太小的话,网络吞吐量是会受到影响的!因为这样ip数据报首部就会多出来,这样数据传输有效量就变少了!注意这里:网络层中会包括寻址和路由两部分的。寻址就根据目的IP地址和子网掩码进行按位与操作,然后计算出来网络号;然后取反目的IP地址和子网掩码进行按位与操作,计算出来主机号!(是这样的,本来每一个主机都有一个IPv4或者IPv6地址,但是根据ip寻找的效率太低了,所以会先寻找在哪个子网中,然后再去寻找主机!)
4.网络接口层,光有ip地址还是不行的, 在以太网中,必须还要有发送方和接收方的mac地址,发送方的mac地址比较容易获得,接收方的mac地址还需套通过ARP协议来获得。然后添加mac头和尾,封装为数据帧。
5.然后触发软中断告知网卡驱动程序,(驱动程序相当于一个接口来操作我们的硬件的),将sk_buff中的数据拷贝到RingBuffer中,然后将数据拷贝到网卡可以直接访问到的DRA内存区域,网卡就要发送了
补充一下:如果我们的客户端在收到ack之后,那我们sk_buff中的数据就可以清理了。然后该连接还可以继续用