您的位置:首页 > 理论基础 > 计算机网络

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) - 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

寄存器变量,顾名思义,就是存贮在寄存器里的变量。由于操作寄存器的速度远高于操作内存,但寄存器的数量有限,所以把最频繁使用的数据存储在寄存器里,有效地提高程序运行速率。C语言定义为  register int a;  由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: