故事的小黄花,
从我进化成智障那年就飘着~
Additional: 有些IDE可以直接与代码存储库如Git,sourceForge等直接进行通信
TCP/IP存在的意义
不同的操作系统,不同的底层物理结构,计算机通过使用共同的一组协议来实现通信(协议:一组明确的规则,比如数据的格式,数据怎么分包等)
分层
网络中的每台机器都称为node,拥有全部功能的计算机称为host。每个网络节点都有来唯一标识节点的一组字节序列(地址)。Internet是最大的基于IP网络,没连入Internet的IP网络称为internet,比如Intranet。
字节序:大于一个字节类型的数据在内存中的存放顺序,不同种类的CPU采用不同的字节序
1. big endian
低字节存放在内存的高地址,数据在网络上的传输和JAVA虚拟机中多字节类型数据的存放也采用这种字节序
2. little endian
不同的网络以不同的方式给节点分配地址,而以太网Ethernet则通过产商来确保计算机的硬件地址,ISP(Internet Service Provider) 从四个区域的Internet注册机构获取IP地址并分配
将网络分层,可以修改实现而不动接口,每一层负责不同的通信功能,便于管理维护,每一层只与其上下层直接通信,实现解耦
- 物理层(bits)
数据 -》在不同物理介质上传播的模拟信号(电磁波,光脉冲,无线电波等)
- 链路层(frames)
职责:数据封装,检错,寻址(ARP)
链路层有很多协议,如Ethernet,无线,PPP和loopback等,路由器为不同的物理网络提供连接。OS中设备驱动器+network interface card处理物理接口细节
串行通信:在一条数据线上,将数据一位一位的依次传送
1. 同步,接收方和发送方必须时间同步
2. 异步,不需要时间同步,接收方根据电压来判断是否有数据发送
并行通信:数据在多条数据线上传送
Ethernet
帧:以太网数据帧的长度必须在46~1500字节之间(不包括CRC,起始符,源MAC,目的MAC等),一个帧往往包括帧起始符和结束符(MAC帧无结束符,因为两个帧间隔9.6us,而且只要少于64字节就丢弃,而PPP帧连续发送,需要结束符判断是否结束一个帧),SOH(start of head),EOT(end of tail)出现在数据中时,则要用转义字符
Q1:为什么帧必须不小于64字节??
保证NIC有足够的时间精确检测到冲突,这一最小的时间由可支持的最长电缆长度和电缆传播速度决定,如果节点收到冲突信号时,数据已经全部发送到目的地,则不重传,最远两台机器之间的round-trip time要小于512bits时间,512bits/8 = 64bytes,所以如果发送的帧小于64字节,就需要填充,但是不算入数据字段的长度。
CSMA/CD:在发数据前节点需要监听网线上的载波,如果9.6us之内没有检测到载波(使刚刚收到数据帧的节点来得及清理接收缓存,为下一个接收做准备),节点就可以发送一帧数据。如果两个节点同时检测到空闲发送数据,检测到冲突的节点会发送“冲突增强(32个1)”信号给介质上的每个介质。节点需要等待一段随机时间再发送数据。帧之前有64bits的前导序列,前7字节是同步码,最后一个字节是起始符。802.3与Ethernet V2规定的MTU不同,38~1492,同时支持以太网和IEEE802.3的NIC会根据长度区分。
Ethernet V2:
目的MAC+源MAC+长度+类型+CRC (6+6+2+46~1500+4)
PPP
在串行链路上封装IP数据报的方法,点对点
转义字符:0x7D
1.同步传输
零填充,连续5个1加0,这样就不会出现0x7E,接收端收到5个1就删除后面的0
2.异步传输
0x7E用0x7D, 0x5E表示
0x7D用0x7D, 0x5D表示
如果有控制字符,则前面加0x7D,后面也要做相应的改变
PPPoE:
现在用户牵宽带,自己在家里组局域网,几台电脑一起共享宽带。所以,PPP帧也需要装到以太网MAC帧中
环回接口:
允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。127网段的IP地址被预留给环回接口,一般使用127.0.0.1,被称为localhost。一个传给环回接口的IP数据报不能出现在任何网络上,当IP数据报离开网络层就被及时的返回。传给广播地址或多播地址也要传一份给自己,传给主机IP的报文都要传给自己(都是考虑从自己那里发出去的包)
ping127.0.0.1 VS ping 主机ip
前者测试服务器(TCP/IP协议)是否正常,后者测试网卡是否正常
串行线路吞吐量:
线路速率9600b/s,一个字节8bits,加上一个起始比特和一个停止比特,那么线路的速率就是960B/s,那么速率传送一个1024字节分组需要1066ms
ARP: IP->MAC地址
高速缓存(一般20分钟过期,除了绑定的情况下)
例:A->B(192.168.85.100)
查询ARP缓存,如果没有,A发一个ARP广播请求,目的MAC为FF-FF-FF-FF-FF-FF-FF-FF,目的IP为192.168.85.100,加上自己的源IP和源MAC。同一个网段内的所有计算机都会收到这个广播,如果IP和自己不一样,则舍弃;一样则更新自己的高速缓存(记下A的IP和MAC),并且单独恢复一个ARP应答给A(将源MAC,IP变为目的MAC,IP,用自己的MAC, IP替换源),A更新自己的缓存。
arp -a
- 网络层(datagram)
职责:分包路由
数据报:20~60字节的头部 {首部长度4位,所以首部最大为60个字节(2^4-1)*4,TOS表示服务类型(如最小时延,最大吞吐,最高可靠性和最小费用,只能置其中一个服务,全为0时,是一般服务)。总长度是数据长度(最大2^16-1),是必要字段,因为帧会填充。一般主机要求不超过576字节,所以有赖TCP分割数据。标识字段用来标识主机发送的每一个报文。TTL(time-to-live)规定了数据报最多可以经历过多少路由器(最多255,默认32或64),当值为0,舍弃报文,并发送ICMP报文通知源主机。协议标志是指哪个协议向IP发数据,如ICMP。检验和是根据IP首部计算的检验字段(先把检验字段设为0,对首部每16位进行反码,再求和,接收方收到数据包时,根据首部计算检验和,如果没有错误,结果和检验和同或返回全是1,如果不是,丢弃,并不发错误报告,由上层负责重传)。因为路由过程中TTL不断减1,所以只需要在检验和加1就好了,不需要对IP整个首部进行重新进行。}
IPV4 - 32位,4个无符号字节(0~255)以“.”隔开
IPV6 - 128位,8个16bits以”:”隔开, 连续0区块可以不写或者用0代替
127.0.0.1 loopback
主机名 localhost
IPV6的回送地址是::1
所有以0.开头的IPV4地址都指向同一个本地网络上的一个主机。255.255.255.255广播地址,发送到这个地址,则本地网络上的所有节点都会收到(不能超越本地网络)
私网地址:
10.
172.16
172.31
192.168
NAT(network access translation): 外网<->私网
A-》B,若B路由器的缓存用完了,IP的处理方式是发送ICMP给A,然后由上层如TCP来完成可靠性
ICMP:为IP层通信提供一个维护,诊断和测试的框架,用于判断网络通不通,主机是否可达,路由器是否可用等。Ping过程实际上就是ICMP协议工作的工作,首先建立通道,然后发送包,对方接受后返回,还有网络命令和跟踪路由也是基于ICMP协议的。使用原始IP数据报在主机之间传递错误消息,JAVA不支持(only TCP/UDP),只能通过链接到原生代码来实现。
路由器2发现路由器4不可达,则发送一个ICMP给A
IP路由:
1. 如果TTL是0,就丢包
2. 搜索路由表,优先匹配主机
3. 搜索路由表,匹配子网
4. 搜索路由表,匹配网号
5. 发给默认路由
6. 同一个网络,建立缓存表,数据报被送往以太网驱动程序
7. 以上都失败了,就丢弃这个包,并产生ICMP错误包
路由器的内存中有一个路由表,收到一份数据报,搜索该表:
- 目的IP地址
- 下一站
- 标志(表明目的或者下一站是路由器还是直接接口)
子网寻址:
网络地址不够用(比如A类只有2^24-2),子网应运而生,子网掩码用来区分子网号和主机号:
掩码变长:汇总,减少占用路由表的空间
netstat:提供系统接口上的信息
主机也有路由器
- 传输层(segment)
职责: 为两台主机的应用程序提供端到端的通信,reliability(顺序,完整性)
TCP:可靠,超时重传,可以将应用程序提交的数据分成合适的小块交给网络层,确认收到分组或者设置发送最后确认分组超时时钟等
UDP:不可靠,但是比较快
端口号:16bits,每一个端口监听一个服务
1-1023 保留给已知端口(服务器)
1024-5000 临时端口(客户端口,确保是本机唯一就可以啦)
- 应用层
APP-KERNEL-NETWORK
WEB浏览器向WEB服务器发送获取网页的请求时,浏览器只能与本地客户机的传输层对话,传输层将请求分解成TCP片,添加序列号和校验和,然后将请求传递给本地网络层,网络层将TCP片分成IP数据报,并路由(IP),ARP(IP-》MAC),数据编码成特定物理介质的模拟信号
常见服务和应用
DNS: 一个分布的数据库,由它来提供IP地址和主机名之间的映射信息。一个地址可以有多个名字,一个名字可以指示多个不同的地址(DNS负载均衡)
DHCP:IP地址有可能在程序运行时改变,所以每次需要时要检查当前的IP地址,而不是将其缓存。一个计算机启动时,它会发送请求给255.255.255.255,然后找到DHCP服务器
防火墙(网络层):检查传入或者传出网络接口的各个包,根据一组规则接受或者拒绝包。过滤一般是根据网络地址和端口的。
Proxy server(应用层):如果防火墙阻止某主机访问外界网络,此时向本地代理服务器(支持local caching)发送请求,然后代理去请求WEB服务器页面,将回应转发给主机。Socket代理服务器是作用在传输层,可以代理所有的TCP/UDP。公司可以使用代理服务器来跟踪员工的web使用情况。
代理器目前不能应对所有协议,通常已有的协议有HTTP,FTP等,可以通过HTTP来接入他们的协议,最著名的是SOAP
Reference
- JAVA 网络编程
- TCP/IP详解 卷1