http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
现在广泛应用的,是TCP/IP体系中的五层结构。对应的就是OSI体系的七层结构。
那么,五层结构,也就是分为:
物理层 -- 数据链路层 -- 网络层 -- 传输层 -- 应用层
怎么记呢?从理解上记
比如我现在需要从 广州 -- 洛杉矶 怎么做
1、物理层 (网线)
计算机要通信,肯定要连接在一起,现在计算机的通信都是通过光缆来连接的,和外国的,也是通过海底光缆来连接的。所以物理层要解决的就是,链接,然后0101010101010101010发送信息
2、数据链路层 (把1010100101分组 && 拥有了MAC,局域网广播通信)
但是这样不能识别,肯定要按照规定的分组来识别,比如8个一组等等。同时,多台计算机连接在一起形成一个子网,确实可以通讯了,但是我发给你,也需要有你的地址。所以,数据链路层就解决了这个问题。把数据变成 MAC地址 + 数据的格式,然后通过广播的方式,广播就是在你的局域网中发出去,每个人都可以看到,但是如果比较和自己的MAC不对应,就不接收。
3、网络层 (IP协议,广域网通信, 引进路由)
现在是可以通讯了,但是按照上面的方式,每次发送数据都用广播的方式,是不行的。世界上太多机器了,不能这样。不同网段的,就不能用广播的方式来传递了。不然会窘机
因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。
遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。
这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。
所以,有了IP协议,在广域网通讯的时候,如果同一局域网的可以用MAC地址这样广播方式搜查,如果不同局域网的,就不知道对方的MAC地址。那么就发送给自己的网关,网关会识别然后发送去其他网段的了。
所以:分两类情况
3.1 如果同一局域网,那么发送 对方MAC 对方IP
3.2 如果不同局域网,那么发送 网关MAC 对方IP
4、传输层 (各种应用监听的端口不同,加入端口,似的发送更加明确)
现在真的真的可以通讯了,但是我们那么多应用,可以一边聊天,一边上网。怎么区分是谁的?所以,加入端口这个概念。即可区分。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。
这里有了TCP 、、、UDP协议,她们的头部都加上了端口这个东西即可
TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。
5、应用层 (解析拿到过来的东西)
即使TCP可以应用在stmp、http中,那么还是需要有她们各自的格式来解读。这就是应用层解决的东西
最后变成了这样
2020-08-06 20:47:04:
什么是网卡?
网卡就是把数字信号转换成光电信号的东西。这个是一个传输协议栈,所有东西都说的是传输方面的,比如物理层其实说的是东西怎么在物理层传播.
网卡运行在CPU
------------------------------
物理层
数据链路
struct ethhdr { unsigned char h_dest[ETH_LENGTH]; unsigned char d_dest[ETH_LENGTH]; unsigned short h_proto; } s;
网络层
struct iphdr { unsigned char version:4, hdrlen:4; // 虽然是4bit,可以表示15,但是单位要*4 unsigned char tos; // 流媒体那些 unsigned char totlen; unsigned short id; unsigned short flag:3, offset:13; unsigned char ttl; // 网络经过一层就会减1,默认64 unsigned char proto; // tcp/udp unsigned short check_sum; unsigned int s_ip; unsigned int d_ip; } c;
传输层(UDP/TCP)
什么是端口: 传输层那边定义的一个字段,叫端口
struct udphdr { unsigned short s_port; unsigned short d_port; unsigned short length; unsigned short check_sum; };
// TCP详解
1. 三次握手发生在函数的哪里呢?
客户端: connect
服务器: listen()和accept()这两个函数之间,由系统的tcp协议栈实现的.
第一个SYN过来后, 有一个syn队列...
收完之后,假如accept队列。变成一个TCB(使用五元组唯一确定)..
2. 调用send的过程: 从用户态发去内核态,然后内核态又是用协议栈发去网卡的.
TCP是怎么保证顺序的? 网络上是无序的,通过延迟ack
3. tcp如何确定发多少个包
NAT:
1。完全锥形nat:我要去808找晶晶,假如真的存在,就可以进去
2. ip限制锥形nat:只允许固定的IP放问数据进来。
3. 端口限制锥形nat:ip+端口
4. 对称nat: 锥形nat都是客户端:网关:服务器 = 1:1:N,但是对称nat就是1:N:N\
Q1:如何判断网关nat类型