OSI以及分层模型
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议(5层):物理层、数据链路层、网络层、运输层、 应用层
OSI的7层模型主要是理论研究的意义,而实际使用的是4层的TCP/IP模型(而TCP/IP的第4层网络接口层并没有什么实际的内容)。5层模型是7层模型和TCP/IP四层模型的一个折中,仅仅用于学习网络的原理。
OSI的7层模型每一层的作用如下:
1. 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
2. 数据链路层:将比特组装成帧和点到点的传递(帧Frame)
3. 网络层:负责数据包从源到宿的传递和网际互连(包Packet)
4. 传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
5. 会话层:建立、管理和终止会话(会话协议数据单元SPDU)
6. 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
7. 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
5层理论分析模型的每一层作用如下:
1. 应用层:直接为用户的应用进程提供服务
2. 传输层:负责两个主机中进程间的通信提供服务
3. 网络层:负责为分组交换网上的不同主机提供通信服务;选择合适的路由传送分组
4. 数据链路层:将网络层交付下来的分组封装为帧,在相邻节点的链路上传递帧中的数据
5. 物理层:透明的传送比特流
IP地址分类
A类地址:以0开头,第一个字节范围:0~127(1.0.0.0 - 126.255.255.255)
B类地址:以10开头,第一个字节范围:128~191(128.0.0.0 - 191.255.255.255)
C类地址:以110开头,第一个字节范围:192~223(192.0.0.0 - 223.255.255.255)
D类地址:以1110开头,作为多播地址
保留地址:10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。
TCP与UDP的区别
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
两者的区别:
1. 基于连接与无连接;
2. 对系统资源的要求TCP较多,UDP少;
3. UDP程序结构较简单;
4. 流模式(TCP把数据看做是无结构的字节流)与数据报模式(UDP是面向数据报);
5. TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
TCP报文首部格式
至于首部格式中的各个字段的含义,直接找本书看看就差不多了
详解: http://blog.csdn.net/wilsonpeng3/article/details/12869233
TCP的三次握手与四次挥手过程及TIMEWAIT的作用
三次握手建立连接:
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了
如果三次握手修改为两次握手,那么会存在一种”已失效连接请求报文段”造成的无效连接的情况。假设在如下场景下,采用2次握手。client发送一个请求报文段给server,而这个报文段在网络的某个地方阻塞了,那么clent超时重新发送一个连接请求报文段,此时server收到第二个连接请求报文段,并为连接分配资源,建立连接,并在该连接上发送数据,之后断开连接。如果连接断开之后,之前阻塞的请求建立报文又传送给了server,那么此时如果是2次握手,server会为这个迟到的无效请求报文建立一个无效的连接,而client并没有数据要发送给server,这样资源就被浪费了。
四次挥手断开连接:
中断连接端可以是Client端,也可以是Server端。假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”Client端没有数据要发给你了”,但是如果server还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以server先发送ACK,”告诉Client端,请求我收到了,但是我还没准备好,请继续等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,”就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那么Client端也可以关闭连接了。
断开连接需要四次的原因是存在被请求断开连接的一段,在收到断开连接请求的时候可能还有数据需要发送,所以只能对请求进行回复,但是并不能立刻断开连接,也就是断开的时候双方都需要在自己没有数据发送的时候发送一个fin报文,并且得到对方的ack。
至于最后TIME-WAIT需要等待2MSL(2倍的报文最长生存时间)的原因,主要有两点:
1. 保证请求断开连接的一端A最后发送的一个确认关闭ack一定可以发送到对方B。在B收到A的最后一个ack的时候,存在该ack丢失的情形,所以A在等待2MSL期间,可以收到B重传的fin+ack。A在收到重传的fin+ack之后重新发送确认并重置2MSL计时器。这样可以保证B可以正常的关闭,如果等待时间少于2MSL,那么可能A关闭之后,B却因为没有收到这个ack而一直重传fin+ack而无法关闭。
2. 防止出现”已失效连接请求报文段”。因为在发送最后一个ack之后,等待2MSL可以保证此次连接过程中产生的所有报文都会消失,保证在新建立连接的时候不会受到前一次连接中的阻塞请求连接报文的影响(UNP中对这种情况有详细的说明)。
补充:
TCP 保活计时器:假设客户端和服务器建立的TCP连接,但是此时客户端故障而非正常的断开了这个连接,服务器并不知道客户端之间的连接是否存在,因此可能无谓的等待在这个失效的连接上。因此需要采用一种机制来避免,服务端采用的措施就是在每次接收到客户端的数据的时候就重启一个保活计时器(大概2小时),如果保活计时器到时之后服务端仍然没有收到数据,那么服务端就发送一个探测报文,每隔75分钟发送一个,连续10个报文都没有收到客户端的响应,就认为客户端意外断开。
TCP拥塞控制
计算机网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制,流量控制是让数据发送端减慢数据的发送速度。
拥塞控制方法:
1. 慢开始( slow-start )
2. 拥塞避免( congestion avoidance )
3. 快重传( fast retransmit )
4. 快恢复( fast recovery )
TCP拥塞控制主要过程
慢启动阶段:
当建立新的TCP连接时,拥塞窗口(congestion window,cwnd)初始化为一个数据包大小。源端按cwnd大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量,这样cwnd就将随着回路响应时间(Round Trip Time,RTT)呈指数增长,源端向网络发送的数据量将急剧增加。由于在发生拥塞时,拥塞窗口会减半或降到1,因此慢启动确保了源端的发送速率最多是链路带宽的两倍。
拥塞避免阶段:
如果TCP源端发现超时或收到3个相同ACK副本时,即认为网络发生了拥塞(主要因为由传输引起的数据包损坏和丢失的概率很小(<<1%))。此时就进入拥塞避免阶段。慢启动阈值(ssthresh)被设置为当前拥塞窗口大小的一半;如果超时,拥塞窗口被置1。如果cwnd>ssthresh,TCP就执行拥塞避免算法,此时,cwnd在每次收到一个ACK时只增加1/cwnd个数据包,这样,在一个RTT内,cwnd将增加1,所以在拥塞避免阶段,cwnd不是呈指数增长,而是线性增长。
快速重传和快速恢复阶段:
快速重传是当TCP源端收到到三个相同的ACK副本时,即认为有数据包丢失,则源端重传丢失的数据包,而不必等待RTO超时。同时将ssthresh设置为当前cwnd值的一半,并且将cwnd减为原先的一半。快速恢复是基于“管道”模型(pipe model)的“数据包守恒”的原则(conservation of packets principle),即同一时刻在网络中传输的数据包数量是恒定的,只有当“旧”数据包离开网络后,才能发送“新”数据包进入网络。如果发送方收到一个重复的ACK,则认为已经有一个数据包离开了网络,于是将拥塞窗口加1(这里的1是1个报文段长度,实际上收到3个重复ack,窗口就增加了3)。
TCP滑动窗口以及回退N(Go-Back-N)
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。而帧的确认采用累积确认的方式,也就是接收方不对接收到的帧逐个进行确认,而是子收到若干个分组之后,对按序到达的连续分组的最后一个分组发送确认,代表到该分组为止的所有分组都被确认收到。这种累积确认的优点是实现起来比较容易,而且对于丢失的确认不必进行重传。但是缺点是无法正确的向发送方反映已经接受到的分组。比如,当前发送方连续发送了5个分组,其中第三个分组丢失了,其他四个正确接收到,那么由于只能对前面两个分组进行确认,因此发送方并不知道后面3个分组的实际接收情况。于是就需要将后面的3个分组都重传一次。这就是回退N帧,即需要再回退并重传已经发送的N个分组。这种协议在通信质量不好的情况小效率将会变得很低,造成大量的重复分组的发送。