一.TCP/IP协议
TCP/IP 是互联网相关各类协议族的总称。
1.TCP/IP的分层管理
TCP/IP协议里最重要的一点就是分层。IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP段,属于端到端的传输TCP/IP协议族按层次分别为 应用层,传输层,网络层,数据链路层,物理层。越靠下越接近硬件。
物理层:该层负责 比特流在节点之间的传输,即负责物理传输,这一层的协议既与链路有关,也与传输的介质有关。通俗来说就是把计算机连接起来的物理手段。
数据链路层:控制网络层与物理层之间的通信,主要功能是保证物理线路上进行可靠的数据传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据结构的结构包,他不仅包含原始数据,还包含发送方和接收方的物理地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。如果在传达数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
网络层:决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权,网络拥塞程度,服务质量以及可选路由的花费等来决定从网络中的A节点到B节点的最佳途径。即建立主机到主机的通信。
传输层:该层为两台主机上的应用程序提供端到端的通信。传输层有两个传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,udp是不可靠的或者说无连接的协议
应用层:应用程序收到传输层的数据后,接下来就要进行解读。解读必须事先规定好格式,而应用层就是规定应用程序的数据格式。主要的协议有:HTTP.FTP,Telent等。
2.TCP与UDP的区别
TCP/UDP 都是传输层协议,但是两者具有不同的特效,同时也具有不同的应用场景。
UDP
UDP只在IP数据报服务的基础上增加了少量的功能:复用与分用、对整个报文的差错检测。
-
UDP是无连接的
通信前不需要建立连接,通信结束也无需释放连接。 -
UDP是不可靠的
它是尽力而为交付,不能确保每一个数据报都送达。 -
UDP是面向报文的
所谓『面向报文』就是指:UDP数据传输的单位是报文,且不会对数据作任何 拆分 和 拼接 操作。
在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。
在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。 -
UDP没有拥塞控制
UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。
弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。
优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。 -
UDP支持一对一、一对多、多对多、多对一通信
而TCP只支持一对一通信。 -
UDP首部开销小,只有8字节。
而TCP头部至少由20字节,相比于TCP要高效很多。
UDP数据包的结构
一个典型的udp数据报包含如下几个部分:以太网MAC首部+网络层IP数据报首部+传输层UDP首部+要传输的数据
1.以太网MAC头
以太网MAC头由14个字节构成,6个目的地址,6个源地址,2个类型字段,目的地址和源地址是指网卡的MAC地址,具有唯一性。协议是指数据包的高级协议,0X8000:IP协议,0X0806:ARP协议,0X8035:RARP协议
如你要发送的目的MAC地址是:00:1d:09:10:d1:9c 源MAC地址是:01:60:6e:11:02:0f,上层是IP层,标识符是0x0800,那么MAC头就是:00 1d 09 10 d1 9c 01 60 6e 11 02 0f 80 00
一般的以太网帧会有8字节的前导(用于帧同步),4字节的CRC(用于帧校验),这些由网卡芯片自动填充
2.IP数据头
ip数据报头如下:
0x45, 0x00, IPlenght_h, IPlenght_l,0x00, 0x00, 0x00, 0x00, 0x80, 0x11,IPchecksum4, IPchecksum5,IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4
上面是一个简单的ip头的例子,下面一个个的来解释啊!
0x45,其中的高位0x4,表示的是版本号,ipv4的意思,而后面低字节5表示的是指明IPv4协议包头长度的字节数包含多少个32位,这里是5,也就是说协议头是5*4=20个字节的大小。
0x00,定义IP封包在传送过程中要求的服务类型,如果所有4bit均为0,那么就意味着是一般服务,具体如下:
◆000..... (Routine): 过程字段,占3位。设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
◆...0....(Delay):延迟字段 ,占1位,取值:0(正常)1(期待低的延迟)
◆....0...(Throughput):流量字段,占1位,取值:0(正常)1(期特高的流量)
◆.....0..(Reliability) :可靠性字段,占1位,取值:0(正常)1(期特高的可靠性)
◆…..0.(ECN-Capable Transport):显式拥塞指示传输字段,占1位,由源端设置,以显示源端节点的传输协议是支持ECN(Explicit Cogestion Notifica tion,显式拥塞指示)的,取值:0(不支持ECN)1(支持ECN)
◆.......0(Congestion Experienced):拥塞预警字段,占1位,取值:0(正常,不拥塞)1(拥塞)
IPlenght_h, IPlenght_l,表示的是包总长度=IP头长度+UDP头长度+数据长度,长度分为高8位和低8位。
0x00, 0x00,是上面的标志位,16个字节。每一个IP封包都有一个16位的唯一识别码,当程序产生的数据要通过网络传送时都会被拆散成封包形式发送,当封包要进行重组的时候这个ID就是依据了。
0x00, 0x00这16位是由两部分组成,包括3bit的标记位和13bit的分段偏移量。
这是当封包在传输过程中进行最佳组合时使用的3个bit的识别记号,占3位,
◆000(Reserved Fragment):保留分段,当此值为0的时候表示目前未被使用
◆.0.(Don't Fragment):不分段,当此值为0的时候表示封包可以被分段,如果为1则不能被分割
◆..0( More Fragment):更多分段,当上一个值为0时,此值为0就示该封包是最后一个封包,如果为1则表示其后还有被分割的封包
IP协议头格式规定当封包被分段之后,由于网路情况或其它因素影响其抵达顺序不会和当初切割顺序一至,所以当封包进行分段的时候会为各片段做好定位记录,以便在重组的时候就能够
对号入座,值为多少个字节,如果封包并没有被分段,则FO值为0,占13位
0x80表示生存时间。生存时间字段设置了数据报可以经过的最多路由器数,表示数据包在网络上生存多久,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1,当该字段的值为0时,数据报就被丢弃,并发送ICMP消息通知源主机,这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面,占8位
0x11表示的是传输层的协议。如下表所示:
IPchecksum4, IPchecksum5这两个是头校验和的高8位和低8位。
指IPv4数据报包头的校验和,这个数值用来检错用的,用以确保封包被正确无误的接收到,当封包开始进行传送后,接收端主机会利用这个检验值会来检验余下的封包,如果一切无误就会发出确认信息表示接收正常,与UDP和TCP协议包头中的校验和作用是一样的,占16位,
首部检验和字段是根据IP首部计算的检验和码,不对首部后面的数据进行计算,ICMP,IGMP,UDP和TCP协议在它们各自的首部中均含有同时覆盖首部和数据检验和码
IP协议头格式规定了:计算一份数据报的IP检验和,首先把检验和字段置为0,然后,对首部中每个16位进行二进制反码求和(整个首部看成是由一串16位的字组成),结果存在检验和字段中,当接收端收到一份IP数据报后,同样对首部中每个16 位进行二进制反码的求和,由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1,