网络是怎样连接的
A记录的 A 是 address 的缩写
1.4 委托协议栈发送消息
应用程序是通过『描述符』这一类似号码牌的东西来识别套接字的,如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制。
第2章 用电信号传输 TCP/IP 数据——探索协议栈和网卡
套接字的实体就是通信控制信息,协议栈根据套接字记录的控制信息来工作。
操作系统根据五元组来区分不同的套接字: [ 协议, 源ip,源port,目标ip,目标port ]
当数据包太大时,TCP会进行切包,每个包都加上 tcp header,里面有序号,代表数据偏移量,然后接收方可以 包总长度 - header 长度 = 数据包长度,
数据偏移量 + 数据包长度 = ACK 意思是 ACK 之前的包都已经完成接收
以及发送方建立TCP连接时, 发送SYN包时会随机生成一个序号,防止被攻击。
tcp有等待ack超时重发机制,因为ack包传输时间受 物理距离、网络拥塞情况影响较大,所以ack超时时间的设置需要动态调整
根据ack包返回的时间,返回的快,超时时间就短,返回的慢,超时时间就长。
等待ack返回的时间如果什么都不做就太浪费了。TCP 采用滑动窗口来管理发送数据包和等待ack。在发送一个包之后,不用等待返回,直接连续发送后面的几个包。
为了防止包的发送速率比处理速率快导致接收方缓冲区溢出的情况,接收方给发送方返回的ack包中会带有缓冲区可用的容量大小,发送方以这个大小为滑动窗口的大小
四次挥手 time_wait 作用:为了防止最后一个ack丢失,导致FIN 重试,可能导致新的同样端口的套接字被意外关闭,time_wait 是为了ack丢失,FIN重试时仍然能够返回ack的状态。
IP 层
tcp加tcp头部,ip加ip头部和MAC头部,发给网卡的是0/1信号,然后网卡把0/1信号转换成电信号或者光信号通过网线或者光纤传递出去。
IP 地址是分配给网卡的
IP 模块根据路由表 Gateway 栏的内容判断应该把包发给谁(路由器ip地址,如果是自身地址的话代表可以直接给目标IP发送数据)
IP 模块在填写 IP 头部时的目的地址是由 应用程序 -> TCP -> IP 的
IP 模块在填写 MAC 头部时,发送方MAC地址是从网卡的 ROM(只读内存) 中读取的,而根据目的ip地址查询路由表可以得到路由ip地址,而没有路由的MAC地址,所以还需要一个 路由ip 到 路由mac 地址的映射。这个映射就是通过 ARP 实现的。通过在子网里广播查询某个ip的mac地址,对应ip会返回mac地址,由此得到路由的mac地址。