Unix网络
2015-09-30 17:10
316 查看
多播 单播 广播 三者区别
单播
单播简单来说就是只有一个目的地址的封包/帧。这是我们在 TCP/IP 网络中最
常见的一种通信方式,当你用浏览器连接一个Web服务器的时候,建立的就是单播,
当你用QQ和其他人聊天的时候,传输的也是单播。
多播
多播也叫做组播,是介之于单播和广播之间的一种传输方式。多播的目的地址是一
组主机,称之为“多播组(multicast group)”,只有加入了多播组才能收到该组所
发出来的多播。一个多播的例子是在IP上传播视频通话。在 CCNA 的考试中,你只需
要记住多播组的IP地址范围就可以了。标准网络分类中的D类网络是专门保留给多播
的,IP地址范围是224.0.0.0 – 239.255.255.255。这个地址段是保留给本地网络
分段网络协议的,而且类似广播报文,路由器是不会转发多播报文的。
举个例子,在网络路由协议 OSPF 的 Hello 包是会以多播的形式发送到目的IP
地址224.0.0.5的;而 EIRGP Update报文是发送到多播地址224.0.0.10的;RIPv2
则是利用224.0.0.9 来发送路由更新。
广播
广播报文是发送到该网段所有设备的报文/帧。广播包在报文里描述目的地址的数据
是全置1的:在网络第三层里面是以IP地址 255.255.255.255的形式出现,而在网络
第二层则是以MAC地址 ff-ff-ff-ff-ff-ff的形式出现。广播一旦发出,所有同一网
段的设备都会收到该网络报文。请记住,交换机会转发广播报文,而路由器是不会转
发广播报文的。广播用以通知全网设备一些信息,例如ARP和DHCP就是利用广播报文
传输信息的。
IP分片发生在源主机 路由器 重组只发生在目的主机上
“持续 (persist)”定时器 假如之前TCP一方A发送了一个窗口为0的通告,那么另
一方B将无法发送数据,因为A已经没有缓冲区来接受数据了,因此B只能够进行等待
。这个时候,A发送一个窗口为非0的窗口更新通告(例如上面的9号报文,实际上就是
一个窗口更新通告)。这里有必要说明一下这些窗口通告,这些窗口通告,都是附带在
ACK报文中的,不带任何数据信息。TCP不对ACK报文段进行响应,TCP只确认那些包含有数据的ACK报文段。
如果刚才A发送的窗口非0的窗口通告在传输过程中丢失了,那会出现什么情况?
A等待接收数据,因为它已经发送出窗口非0的窗口通告;B在继续等待已经丢失的窗
口通告。这样子就形成了死锁。为了避免这种死锁的发生,发送方B应该使用一个坚持
定时器(persist timer)来周期性地向接收方A查询,以便发现窗口是否已增大。这
些从发送方A发出的报文段称为窗口探查(window probe)。
连接建立(connection establishment)”定时器在发送SYN报文段建立一条新连接
时启动。如果在75秒内没有收到响应,连接建立将中止。
FIN_WAIT_2定时器,当某个连接从FIN_WAIT_1状态变迁到FIN_WAIT_2状态并且不能
再接收任何新数据时,FIN_WAIT_2定时器启动,设为10分钟。定时器超时后,重新设
为75秒,第二次超时后连接被关闭。加入这个定时器的目的是为了避免如果对端一直
不发送 FIN,某个连接会永远滞留在FIN _ WAIT_ 2状态(假设TCP不选用半打开功
能)。
“延迟ACK(delayed ACK)”定时器在TCP收到必须被确认但无需马上发出确认的数据
时设定。如果在200ms内,有数据要在该连接上发送,延迟的ACK响应就可随着数据一
起发送回对端,称为捎带确认。如果200ms后,该确认未能被捎带出去,则定时器超
时,此时需要发送一个立即确认。
保活(keep alive)”定时器在TCP控制块的so_options 字段设置了SOF_KEEPALIVE
选项时生效。如果连接的连续空闲时间超过2小时,则保活定时器超时,此时应向对端
发送连接探测报文段,强迫对端响应。如果收到了期待的响应, TCP可确定对端主机
工作正常,在该连接再次空闲超过 2小时之前,TCP不会再进行保活测试。如果收到
的是RST复位响应, TCP可确定对端主机已重启。如果连续若干次保活测试都未收到
响应, TCP就假定对端主机已崩溃,但它无法区分是主机故障还是连接故障。
“重传(retransmission)”定时器在TCP发送某个数据段时设定。如果该定时器超时
而对端的确认还未到达,TCP将重传该数据段。重传定时器的值 (即TCP等待对端确认
的时间)是动态计算的,与RTT的估计值密切相关,且还取决于该报文段已被重传的次
数。
如果select返回可读,结果只读到0字节,什么情况?
答:对方套接字已经关闭 所以select返回 read读到0
进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其
中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数
,当信号发生时,执行相应的处理函数;(3)执行缺省操作,
从用户调用库函数到系统调用执行的流程。
1) 假设用户调用ssize_t write (int fields, cont void *buff, size_tnbytes);库函数。
2) 库函数会执行int 0x80中断。因为中断使得进程从用户态进入内核态,所以参数
通过寄存器传送。
3) 0x80中断对应的中断例程被称为system call handler。其工作是:
i. 存储大多数寄存器到内核堆栈中。这是汇编代码写的。
ii. 执行真正的系统调用函数――system callservice routine。这是C代码。
iii. 通过ret_from_sys_call()返回,回到用户态的库函数。这是汇编代码。
int arr[] = {1,2,3,4,5};
int *ptr = arr;
printf("%d%d%d",*ptr,*(++ptr),*(ptr++)); 3 3 1
*(ptr++) 代表 先*ptr 后++ptr
一个由 C/C++编译的程序占用的内存(memory)分为以下几个部分:
1. 程序代码区(.text) - 存放函数体的二进制代码 。
2. 文字常量区(.rodata) - 常量字符串就是放在这里的,程序结束后由系统释放(rodata—read only data)。
3. 全局区/静态区(static) - 全局变量 和 静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域(.rwdata or .data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss), 程序结束后由系统释放。
*在 C++中,已经不再严格区分bss和 data了,它们共享一块内存区域
4. 堆区(heap) - 一般由程序员分配释放(new/malloc/calloc delete/free),若程序员不释放,程序结束时可能由 OS 回收。
注意:它与数据结构中的堆是两回事,但分配方式倒类似于链表。
5. 栈区(stack) - 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
单播
单播简单来说就是只有一个目的地址的封包/帧。这是我们在 TCP/IP 网络中最
常见的一种通信方式,当你用浏览器连接一个Web服务器的时候,建立的就是单播,
当你用QQ和其他人聊天的时候,传输的也是单播。
多播
多播也叫做组播,是介之于单播和广播之间的一种传输方式。多播的目的地址是一
组主机,称之为“多播组(multicast group)”,只有加入了多播组才能收到该组所
发出来的多播。一个多播的例子是在IP上传播视频通话。在 CCNA 的考试中,你只需
要记住多播组的IP地址范围就可以了。标准网络分类中的D类网络是专门保留给多播
的,IP地址范围是224.0.0.0 – 239.255.255.255。这个地址段是保留给本地网络
分段网络协议的,而且类似广播报文,路由器是不会转发多播报文的。
举个例子,在网络路由协议 OSPF 的 Hello 包是会以多播的形式发送到目的IP
地址224.0.0.5的;而 EIRGP Update报文是发送到多播地址224.0.0.10的;RIPv2
则是利用224.0.0.9 来发送路由更新。
广播
广播报文是发送到该网段所有设备的报文/帧。广播包在报文里描述目的地址的数据
是全置1的:在网络第三层里面是以IP地址 255.255.255.255的形式出现,而在网络
第二层则是以MAC地址 ff-ff-ff-ff-ff-ff的形式出现。广播一旦发出,所有同一网
段的设备都会收到该网络报文。请记住,交换机会转发广播报文,而路由器是不会转
发广播报文的。广播用以通知全网设备一些信息,例如ARP和DHCP就是利用广播报文
传输信息的。
IP分片发生在源主机 路由器 重组只发生在目的主机上
“持续 (persist)”定时器 假如之前TCP一方A发送了一个窗口为0的通告,那么另
一方B将无法发送数据,因为A已经没有缓冲区来接受数据了,因此B只能够进行等待
。这个时候,A发送一个窗口为非0的窗口更新通告(例如上面的9号报文,实际上就是
一个窗口更新通告)。这里有必要说明一下这些窗口通告,这些窗口通告,都是附带在
ACK报文中的,不带任何数据信息。TCP不对ACK报文段进行响应,TCP只确认那些包含有数据的ACK报文段。
如果刚才A发送的窗口非0的窗口通告在传输过程中丢失了,那会出现什么情况?
A等待接收数据,因为它已经发送出窗口非0的窗口通告;B在继续等待已经丢失的窗
口通告。这样子就形成了死锁。为了避免这种死锁的发生,发送方B应该使用一个坚持
定时器(persist timer)来周期性地向接收方A查询,以便发现窗口是否已增大。这
些从发送方A发出的报文段称为窗口探查(window probe)。
连接建立(connection establishment)”定时器在发送SYN报文段建立一条新连接
时启动。如果在75秒内没有收到响应,连接建立将中止。
FIN_WAIT_2定时器,当某个连接从FIN_WAIT_1状态变迁到FIN_WAIT_2状态并且不能
再接收任何新数据时,FIN_WAIT_2定时器启动,设为10分钟。定时器超时后,重新设
为75秒,第二次超时后连接被关闭。加入这个定时器的目的是为了避免如果对端一直
不发送 FIN,某个连接会永远滞留在FIN _ WAIT_ 2状态(假设TCP不选用半打开功
能)。
“延迟ACK(delayed ACK)”定时器在TCP收到必须被确认但无需马上发出确认的数据
时设定。如果在200ms内,有数据要在该连接上发送,延迟的ACK响应就可随着数据一
起发送回对端,称为捎带确认。如果200ms后,该确认未能被捎带出去,则定时器超
时,此时需要发送一个立即确认。
保活(keep alive)”定时器在TCP控制块的so_options 字段设置了SOF_KEEPALIVE
选项时生效。如果连接的连续空闲时间超过2小时,则保活定时器超时,此时应向对端
发送连接探测报文段,强迫对端响应。如果收到了期待的响应, TCP可确定对端主机
工作正常,在该连接再次空闲超过 2小时之前,TCP不会再进行保活测试。如果收到
的是RST复位响应, TCP可确定对端主机已重启。如果连续若干次保活测试都未收到
响应, TCP就假定对端主机已崩溃,但它无法区分是主机故障还是连接故障。
“重传(retransmission)”定时器在TCP发送某个数据段时设定。如果该定时器超时
而对端的确认还未到达,TCP将重传该数据段。重传定时器的值 (即TCP等待对端确认
的时间)是动态计算的,与RTT的估计值密切相关,且还取决于该报文段已被重传的次
数。
如果select返回可读,结果只读到0字节,什么情况?
答:对方套接字已经关闭 所以select返回 read读到0
进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其
中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数
,当信号发生时,执行相应的处理函数;(3)执行缺省操作,
从用户调用库函数到系统调用执行的流程。
1) 假设用户调用ssize_t write (int fields, cont void *buff, size_tnbytes);库函数。
2) 库函数会执行int 0x80中断。因为中断使得进程从用户态进入内核态,所以参数
通过寄存器传送。
3) 0x80中断对应的中断例程被称为system call handler。其工作是:
i. 存储大多数寄存器到内核堆栈中。这是汇编代码写的。
ii. 执行真正的系统调用函数――system callservice routine。这是C代码。
iii. 通过ret_from_sys_call()返回,回到用户态的库函数。这是汇编代码。
int arr[] = {1,2,3,4,5};
int *ptr = arr;
printf("%d%d%d",*ptr,*(++ptr),*(ptr++)); 3 3 1
*(ptr++) 代表 先*ptr 后++ptr
一个由 C/C++编译的程序占用的内存(memory)分为以下几个部分:
1. 程序代码区(.text) - 存放函数体的二进制代码 。
2. 文字常量区(.rodata) - 常量字符串就是放在这里的,程序结束后由系统释放(rodata—read only data)。
3. 全局区/静态区(static) - 全局变量 和 静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域(.rwdata or .data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss), 程序结束后由系统释放。
*在 C++中,已经不再严格区分bss和 data了,它们共享一块内存区域
4. 堆区(heap) - 一般由程序员分配释放(new/malloc/calloc delete/free),若程序员不释放,程序结束时可能由 OS 回收。
注意:它与数据结构中的堆是两回事,但分配方式倒类似于链表。
5. 栈区(stack) - 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
寄存器变量,顾名思义,就是存贮在寄存器里的变量。由于操作寄存器的速度远高于操作内存,但寄存器的数量有限,所以把最频繁使用的数据存储在寄存器里,有效地提高程序运行速率。C语言定义为 register int a; 由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址
相关文章推荐
- 【网络】——计算机网络
- uc笔记10---网络通信,套接字(Socket),基于 TCP 协议的客户机/服务器模型
- 云计算中心网络资源分配-Faircloud: sharing the network in cloud computing
- 通过HTTP RESTful API 操作elasticsearch搜索数据
- 解析TCP/UDP协议的通讯软件
- android-async-http AsyncHttpClient介绍
- ARP病毒网络防控实战手册
- windows 8 中 使用 httpclient
- TCP/IP总结
- iOS9 HTTP 不能正常使用的解决办法
- http响应状态码大全
- deeplearning系列(一)浅层神经网络
- Linux 网络编程学习---协议栈
- RTCP&RTP协议格式分析
- HTTP头信息解读【SEO必知】
- Raytheon(雷神公司)获得10亿美元合同用于保护政府网络
- LINUX网络基础
- AJAX核心XMLHTTPRequest对象
- xcode升级后ios9.0不能使用http协议的版本的解决方法介绍
- iOS http不能正常使用的解决方法