上篇讲了OSI的七层模型,该模型将网络分为七个层次每个层次之间各司其职互不干扰是一种非常优秀的设计。OSI七层模型是一种非常理想的模型但在现实中使用的是TCP/IP协议(传输控制协议/英特网互联协议),它只有四层大大简化了网络的层次。但TCP/IP协议族并不包括物理层和数据链路层,因此它不能独立的完成计算机网络系统的功能,它必须与其他的协议协同工作。该协议族中最重要的是处于网络层的IP协议与运输层TCP协议!
1、链路层(网络接口层)
该层的功能是负责接收上层的IP数据报并将其封装成帧通过网络发送或者从网络上接收物理帧抽出IP数据报交给网络层。在传输过程中实现透明传输(字节填充法)、差错检验等功能。帧作为该层传输的单位。
2、网络层
负责相邻计算机之间的通信。其功能包括三方面。
一、处理来自传输层的分组发送请求,收到请求后将分组装入IP数据报,填充报头选择去往目标主机的路径然后数据报发往适当的网络接口
二、处理接收的数据报:首先检查其合法性,然后进行寻址,假如该数据报已到达目标主机则去掉报头,将剩余部分交往适当的传输协议;若该数据报尚未到达目标主机则转发该数据报。
三、处理路径 路径选择、流量控制、拥塞控制(通过ICMP协议)等问题。网络层的协议包括:IP(Internet protocol)协议、ICMP(Internet control message protocol)网际控制报文协议、ARP(address resolution protocol)地址解析协议。IP协议是网络层的核心,通过路由选择将下一跳IP封装后交给接口层。IP数据报是无连接服务。ICMP是网络层的补充,可以回送报文用来检验网络是否通畅。ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。路由选择协议分为:内部网关协议IGP(如RIP、OSPF)与外部网关协议。在这一层的数据单位称为数据报。
3、传输层
网络层负责点到点的传输(这里的点指主机或路由器)而传输层负责端到端的传输(这里的端指源主机和目标主机)
提供应用程序间的通信,其功能包括:
一、格式化信息流
二、提供可靠传输
传输的协议主要是:传输控制协议TCP与用户数据报协议。在这一层数据的单位称为段。
在该层的俩个重量级协议:传输控制协议TCP、用户数据报协议UDP。
传输控制协议TCP
1、TCP的最主要特点:面向连接的运输层协议、只能实现点对点传输、提供可靠交付、提供双全工通信(允许双方应用进程在任何时候都能发送数据)、面向字节流。 2、停止等待协议:每发送完一个分组就等待对方确认,收到确认后再发送下一个分组。接收确认、超时重传等功能。 3、连续ARQ协议(滑动窗口协议):采用累积确认的方式,对按序到达的最后一个分组发送确认。 4、TCP报文格式:首部最小长度20+4N。URG紧急数据、ACK确认位、PSH推送操作、RST复位、SYN同步、FIN终止。 5、拥塞控制:慢开始、拥塞避免、快重传、快恢复。重要概念:拥塞窗口cwnd、慢开始门限ssthresh 6、TCP运输连接管理 运输连接有三个阶段:连接建立、数据传送、连接释放。 三次握手:B的TCP服务器进程先创建传输控制块TCB进入LISTEN状态。
A的TCP客户进程也是首先创建传输控制模块TCB后,向B发出连接请求报文段,这时同步位SYN=1,初始序号seq=x(TCP规定SYN=1的报文段不能携带数据,但要消耗一个序号)此时客户端进入SYN-SENT(同步已发送)状态、
B收到连接请求后,如果同意建立连接则向A发送确认,SYN同步位,ACK确认位置1,确认位ack=x+1,同时为自己选择一个初始序号seq=y,此时服务器进入SYN-RCVD同步收到状态,
客户端收到B的确认后,还要向B确认,ACK=1,ack=y+1,seq=x+1.此时A进入ESTABLISHED(已建立连接)状态,当B收到确认后也进入建立连接状态。
为什么还需要第三次的握手呢?原因如下:A向B发送连接请求,长时间未收到B的回应由于超时重传机制,A再一次发送连接请求后来收到了确认建立了连接,数据传输完之后就释放了连接。但此时前一次发送的请求可能并没有丢失而是由于在某个网络节点长时间滞留了,以至到连接释放后的某个时间才到达B。此时B误认为A又发送了一次连接请求,假如不采用三次握手则B端就进入连接建立状态,向A发送确认请求而一直等待A发送的数据,而A没有发送请求因此不会理睬B的确认,这样B的许多资源就这样白白浪费了。
连接释放(四次挥手)
数据传输完后双方都能够释放连接,A的应用进程先向TCP发送连接释放报文段,并停止发送数据主动关闭连接,FIN置1,序号seq=u,它的值为前面传送过的数据最后一个字-节序号加1,此时A进入FIN-WAIT-1(终止等待1)状态,FIN报文段即便不带数据也将消耗一个序号
B收到接连释放报文段后立即发送确认,确认号ack=u+1,ACK=1,seq=v为B前面已传送过的数据的最后一个字节的序号+1,B进入CLOSE-WAIT关闭等待状态,注意此时从A到B方向的连接就释放了,TCP处于半关闭状态,要完全关闭还需要B向A方向关闭!A收到来自B的确认后就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段
若B已经没有要向A发送的数据时,发送关闭连接报文段FIN=1,ACK=1,seq=w,ack=u+1重复上次已发送的确认号,此时B进入LASE-ACK最后确认状态,
A在收到B的连接释放报文段后必须对此确认,ACK=1 确认号ack=w+1,seq=u+1,然后进入TIME-WAIT(时间等待)状态。等待俩个MSL(最长报文段寿命)后A才进入CLOSE状态。
为什么最后需要等待俩个最长报文段寿命时间呢?
俩点理由:第一为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认
第二、就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
用户数据报协议UDP
特点: 1、UDP是无连接的 2、UDP使用尽最大努力交付 3、UDP是面向报文的 4、UDP没有拥塞控制 5、UDP支持一对一,一对多、多对一的交互通信 6、UDP的首部开销小只有8个字节。TCP、UDP比较
- TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
- TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
- TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
- TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
- TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
- TCP面向的是字节流的服务,UDP面向的是报文的服务。
- 多播的信息一定要用udp实现,因为tcp只支持一对一通信。
- 如果一个应用场景中大多是简短的信息,适合用udp实现,因为udp是基于报文段的,它直接对上层应用的数据封装成报文段,然后丢在网络中,如果信息量太大,会在链路层中被分片,影响传输效率。
- 如果一个应用场景重性能甚于重完整性和安全性,那么适合于udp,比如多媒体应用,缺一两帧不影响用户体验,但是需要流媒体到达的速度快,因此比较适合用udp
- 如果要求快速响应,那么udp听起来比较合适
- 如果又要利用udp的快速响应优点,又想可靠传输,那么只能考上层应用自己制定规则了。
- 常见的使用udp的例子:ICQ,QQ的聊天模块。