网络是怎么连通的(二)


上节讲到http请求会调用socket接口进行数据发送和接收,这节是从数据到报文
1,协议栈
上半部分是接受应用的委托,通过tcp,udp进行数据收发
下半部分是通过ip协议控制网络包收发操作,ip包括arp和icmp

icmp用于告知网络传送中出现错误以及各种控制信息
arp用于查询ip对应的mac地址,ip下面的网卡驱动控制硬件完成实际信号传送

协议栈通过套接字的控制信息来工作
套接字是什么,可以说是用于通信操作的控制信息,例如ip,端口,状态,时间等
创建时候分配一块内存空间,写入初始状态(监听,创建连接),把绑定的描述符告知应用。

2,连接
实际上是通信双方交换控制信息,告诉协议栈应该和谁通信
控制信息分为两类,头部控制,tcp头,ip头,以太头;套接字内存记录
connect( < 描述符 >, < 服务器 IP 地址和端口号 >, …)
SYN=1,SEQ=random;ACK=len+SEQ,SYN=1,SEQ=random;ACK=len+SEQ

3,收发数据
应用程序调用 write 将要发送的数据交给协议栈,放到缓冲区,都是小包会影响网络效率
缓冲区什么时候发送,长度优先和时间优先,不等待延时,应用也可以控制直接发送
MTU=1500,MSS=1460,adsl需要额外头部,小于1500

具体的read和write却跟对应文件描述符的具体实现不同。
比如socket的就是走网络,普通文件的就是走磁盘IO
SYN=1,SEQ=random;ACK=len+SEQ,SYN=1,SEQ=random;ACK=len+SEQ
通过“序号”和“ACK 号”可以确认接收方是否收到了网络包,进行重传

返回 ACK 号的等待时间
TCP 采用了动态调整等待时间的方法,在发送数据的过程中持续测量 ACK 号的返回时间,
变慢则延长等待时间,马上返回就缩短等待时间

所谓滑动窗口, 就是在发送一个包之后, 不等待 ACK 号返回, 
而是直接发送后续的一系列包,充分利用ACK的等待时间
如果数据到达的速率比处理这些数据并传递给应用程序的速率还要快, 那么接收缓冲区中
的数据就会越堆越多, 最后就会溢出,接收方需要告诉发送方自己最多能接收多少数据

窗口更新是接收方处理了数据才有更新,发送方可以减去每次发送计算更新
接收方在发送ack和窗口更新时候,等待一段时间,因为接收完成到传给应用需要一点时间,
两种通知合并在一个包里面发送了

断开连接,FIN=1;ACK;FIN=1;ACK;
服务端没有接收到ack,会重传;不要立即删除客户端,新套接字有相同端口号,FIN会错传

数据的每一次转发都是需要ip根据目的ip地址,找到mac,委托以太网发送
ip模块负责添加ip头和mac头,以太网可以换成WiFi,adsl,ftth等
IP 模块也不关心 TCP 的操作阶段, 对于包的乱序和丢失也一概不知
发送方 IP 地址需要判断发送所使用的网卡,并填写该网卡的 IP地址

路由表中Gateway 列表示下一个路由器的 IP 地址,也就是接收方ip,接收方mac
interface是出接口ip,就是发送方ip,发送方mac
MAC 地址和 IP 地址是没有区别的,可以通过arp广播根据ip查询mac地址
arp是可以缓存的,避免错误,是可以失效更新

网卡:rom保存mac,缓冲区临时保存数据,mac检查碰撞重发,phy发送接收信号电路
MAC 模块会将包从缓冲区中取出, 并在开头加上报头和起始帧分界符,
在末尾加上用于检测错误的帧校验序列,报头是56个比特01交替,确定包读取时机
发送时候,没法读取连续不变信号,需要数据信号和时钟信号叠加在一起

半双工模式中, 为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号
MAC 模块从报头开始将数字信息按每个比特转换成电信号通用信号,
然后由 PHY信号收发模块转换为网线格式发送出去,检测有没有信号进来
网卡收包绑定中断通知cpu处理
如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。
根据ip头部标记和偏移,重组分片的包,交给tcp处理

音视频,dns等不需要重发的包采用udp协议更快

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值