OSI七层协议与TCP/IP协议基础(收集的资源)

OSI七层网络结构图与TCP/IP五层网络结构图
 

 

(1) OSI七层模型
OSI中的层 功能 TCP/IP协议族 
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 
表示层 数据格式化,代码转换,数据加密 没有协议 
会话层 解除或建立与别的接点的联系 没有协议 
传输层 提供端对端的接口 TCP,UDP 
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU 
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2
 
 

 

(2)TCP/IP 五层模型的协议 
应用层 
传输层 
网络层 
数据链路层 
物理层

 


物理层:中继器、集线器、还有我们通常说的双绞线也工作在物理层 
数据链路层:网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层) 
网络层:路由器、三层交换机 
传输层:四层交换机、也有工作在四层的路由器

 

TCP连接时的三次握手和连接终止时的四次挥手

 

相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.
 
   而且对于有网络协议工程师之类笔试,几乎是必考的内容.企业对这个问题热情之高,出乎我的意料:-)。有时上午面试前强调这个问题,并重复讲一次,下午几乎每一个人都被问到这个问题。
 
因此在这里详细解释一下这两个过程。
 
TCP三次握手
 
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
 
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的***和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

OSI七层协议与TCP/IP协议基础(收集的资源)
 

 

 

 

•第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的***(Sequence Number)字段里。

OSI七层协议与TCP/IP协议基础(收集的资源)
 

 

 

 

•第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

 

OSI七层协议与TCP/IP协议基础(收集的资源)

 

•第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
OSI七层协议与TCP/IP协议基础(收集的资源)

 

 

 

SYN攻击

 

   在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

 

  Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

 

 Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

 

netstat -n -p TCP | grep SYN_RECV

 

一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

 

但是不能完全防范syn攻击。

 

 

 

TCP 四次挥手

 

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

 

OSI七层协议与TCP/IP协议基础(收集的资源)

 

参见wireshark抓包,实测的抓包结果并没有严格按挥手时序。我估计是时间间隔太短造成。

 

 

 

OSI七层协议与TCP/IP协议基础(收集的资源)

 

UDP和TCP的区别是什么?
TCP的全称为传输控制协议。这种协议可以提供面向连接的可靠的字节流服务。第二种协议为UDP全称为用户报文协议,它可以提供面向非连接的不可靠的点到多点的通信。这是两种协议的区别。

 


TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

 

TCP的缓冲、流控与窗口
    1.TCP使用窗口机制进行流量控制 。
    2. 什么是窗口?
    连接建立时,各端分配一块缓冲区(用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的 缓冲区尺寸剩余 缓冲区空间的数量)叫做窗口 。

 

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并 不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?(建立连接三次握手,超时重传,检验数据,流量控制等原因)

 

 

 

 广播的实现
应用程序只能通过UDP方式发送广播。
一般情况下,如果调用sendto,只能向非广播地址发送数据报。如果要发送广播数据报,必须告诉内核,可以通过设置SO_BROADCAST套接口选项来做到这一点。
int on=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));

 

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

 

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

 

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

 

 

 Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中, 主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于 10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一 个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

广播地址主要有两类

  广播地址应用于网络内的所有主机
  1)受限广播
  它不被路由但会被送到相同物理网络段上的所有主机
  IP地址的网络字段和主机字段全为1就是地址255.255.255.255
  2)直接广播
  网络广播会被路由,并会发送到专门网络上的每台主机
  IP地址的网络字段定义这个网络,主机字段通常全为1,如 192.168.10.255

四种I P广播地址

  受限的广播地址
  受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚 至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
  指向网络的广播
  指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
  指向子网的广播
  指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往 128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为 255.255.254.0,该地址就不是指向子网的广播地址。
  指向所有子网的广播  
指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如,如果目的子网 掩码为255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向 网络的广播。

广播和广播地址

  1. TCP/IP协议栈中, 传输层只有UDP可以广播.
  2. 只能对同一子网内部广播, 广播数据包不经过路由器.
  3. UDP的广播地址为255.255.255.255
  4. 在winsock实现中, 有一个选项对应是否允许广播.
  必须调用setsockopt打开该选项.
  5. 打开后, 用sendto向255.255.255.255发送的数据包全部广播.
  很多局域网都定义了一个特殊的保留地址, 称为广播地址. 当信息头中目的地址域的内容为广播地址时, 该帧被局域网上所有计算机接收. 这个过程称为广播.
  合法的广播地址就是主机的网络地址加上最大的主机号。网络地址通过机器的ip地址与子网掩码按位与得出,我们以ip地址为10.78.202.175 ,子网掩码为255.255.255.0。
  为例来分析一下上面的几个概念
  首先将这两个东西换算成二进制代码
  ip地址:00001010.01001110.11001010.10101111
  子网掩码:11111111.11111111.11111111.00000000
  按位与之后得出网络地址:00001010.01001110.11001010.00000000
  十进制表示就是10.78.202.0
  这个网络地址理论上可以有254台主机