zoukankan      html  css  js  c++  java
  • 计算机网络之传输层

    传输层
     
    概念
    两个主机进行通讯实际上是应用层的通信,称为端到端通信(点到点通信在数据链路层)
     
    概念区分
    IP协议的作用是提供主机之间的逻辑通信
    TCP和UDP协议是提供进程之间的逻辑通信(逻辑通信意思是,通信像是水平传输的,但实际上并没有一条这样的水平线)
     
    功能
    1、端到端通信
    2、对报文进行差错检验
     
    分类
    面向连接:TCP(单位 TCP报文段)
    面向无连接:UDP(单位 UDP报文或用户数据)
     
     
    UDP协议
    UDP协议只在IP协议的基础上增加了一点功能,即端口功能和差错检验的功能
     
    主要特点
    1、是面向无连接的,发送数据之前不需要建立连接
    2、UDP只是尽最大努力交付,是不可靠传输,也不使用拥塞控制
    3、UDP是面向报文的,(应用层给什么发什么,不拆分也不操作)比较适合多媒体通信
    4、UDP支持一对一、一对多、多对多的通信
    5、UDP的首部开销小,只有8个字节(有伪首部12字节,伪首部是为了检验和)
     
     
     
    TCP协议
     
    主要特点
    1、是面向连接的,发送数据之前必须建立连接
    2、TCP是可靠传输
    3、TCP是面向字节流的
    4、TCP只支持一对一的通信,提供全双工服务
    5、头部比较大有20字节
     
    面向流
    1、首先应用程序将字节写入TCP的发送缓存(对进程把多长的报文发送到缓存里不关心)
    2、TCP根据对方给出的窗口大小和当前网络拥塞程度来确定一个报文段包含多少个字节
    3、也可以等待积累到了足够长的字节再构成报文一起发送
    4、发送到接收端的接收缓存
    5、接收缓存重新进行排序(机制同数据链路层的滑动窗口),然后发送给应用层
     
     
    头部
     
    源端口:发送报文的端口号
    目地端口:接收报文的端口号
    序号:用来标志发送端向接收端发送的数据字节流,一般是这个报文段中的第一个数据字节(如,之前已经发送了x个字节,此次序列的值为(x-1))
    确认号:用来标志发送端当前收到对方的数据字节流(如,之前已经收到了一个字节,此次的确认号是y)[TCP支持全双工通信,因此两个方向的数据流信号都很重要]
    数据偏移:指出TCP报文的的数据离报文起始处有多远
    保留字段:留给以后使用
    URG:为1表示紧急指针有效,告诉系统此操作文段中有紧急数据,应尽快传送
    ACK:为1表示确认序号有效
    PSH:接收TCP收到PSH为1时,应该尽快将这个报文给应用层,而不要等缓存都满了再传
    RST:为1表示发送端出问题了,要先释放连接,然后再重建连接
    SYN:同步序号为1用来发起一个连接请求
    FIN:用来释放一个连接,为1表示发送端发送数据完毕,要求释放传输连接
    窗口:用来让对方释放窗口的大小,最大为65535bit
    检验和:检验的范围包括TCP的头部和数据部分,一定是由发送端计算和存储,即手段检验(也有12字节的伪首部同UDP)
    紧急指针:支出本报文段紧急数据的最后一个字节的序号(仅当URG为1才有效)[注:紧急数据放在本报文数据段的最前面]
     
    端口
    由一个16位端口号进行标志
    注:端口号只具有本地意义,即端口号只是标志本计算机应用层中的各进程,不同计算机相同的端口号一般是没有联系的
    端口号分类
    0~1023为熟知端口
    1024~49151为登记端口
    49152~65535是客户端口或者短暂端口
     
     
    TCP连接管理
    采用的是客户服务器的方式
     
    建立连接(三次握手)
    1、客户端是主动端,服务端只需要打开一个socket监听相应的端口
    2、第一次握手:客户端向服务端发起请求:SYN = 1 ,seq=x;
    3、第二次握手:服务器向客户端确认(如果同意连接):SYN=1,ACK=1 ,seq=y,ack=x+1(服务器向客户端发了一个字节,并回复客户端说已经收到客户发出的x字节,下次从x+1开始发)
    4、第三次握手:客户端收到服务器的同意报文,回复服务器:ACK=1,seq=x+1,ack=y+1
     
    释放连接(四次挥手)
    要分为两块,客户端的分离和服务器的分离
    1、A向B发起连接释放请求,表示自己已经没有要发送的内容了:FIN=1,seq=u
    2、B确认A刚刚发来的连接释放请求:ACK=1,seq=v,ack=u+1(此时A到B方向的连接已经释放了,TCP属于办关闭状态,但B如果发送数据,A仍要接受)
    3、若B已经没有要向A发送的数据了,也发起连接释放请求:FIN=1,ACK=1,seq=w,ack=u+1
    4、A再向B发出确认:ACK=1,seq=u+1,ack=w+1(此时连接完全释放)
     
     
    TCP可靠传输
    每一端都要有两个窗口,一个发送窗口,一个接收窗口,经常处于动态变化之中(发送窗口的大小取决于对方接收窗口的大小)
    TCP的传输机制用字节的序列进行控制,TCP所有的确认都是基于序列而不是基于报文段
     
    超时重传、累积确认同数据链路层
     
    流量控制和拥塞控制
    流量控制的范围在给定的发送端和接收端通信量的控制
    拥塞控制是一个全局的过程,涉及到所有的路由器(但二者都是使用滑动窗口机制,所以经常一起出现)
     
    拥塞控制方法
    拥塞窗口:发送端维护一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于拥塞程度,发送的数据量=min{cwnd,(拥塞窗口), 发送窗口 }
     
    慢开始
    1、慢开始是指刚刚发送报文段时,将拥塞窗口设置为1
    2、每收到一个对新的报文的确认之后,将拥塞窗口的大小翻倍,直到达到门阀值ssthresh
    3、达到门阀值之后实施拥塞避免算法
     
    拥塞避免
    1、达到门阀值之后实施,每接收到一个先的报文的确认,拥塞窗口加1,而不是翻倍
    2、当网络真的开始拥塞时,就要把慢开始门阀值设置为发送方窗口的一半,然后将拥塞窗口置为1,再重新执行慢开始算法(乘法减少,加法增大)
     
    快重传
    1、比如有1、2、3、4个数据报,当接收窗口收到1,3数据报,但迟迟没有收到2这个数据报时,会向发送端发出连续三个确认收到数据报1的回复
    2、发送端看到连续三个回复,就直接将1后面的2数据报重传,而不用等到超时重传了,可以节省了一定的时间
     
    快恢复
    1、当发送端连续三次收到重复确认时,将门阀值减半,拥塞窗口的值和门阀值相等,再执行拥塞避免算法
  • 相关阅读:
    Richardson成熟度模型:关于REST的不同风格
    领域驱动设计
    dubbo初探
    pom使用异常问题
    [转]解决BootStrap validator验证的图标错位问题
    万恶的360浏览器
    利用Barcode4j实现输出ean13条形码到文件、流的工具类
    使用hibernate中的hql进行分页设置setMaxResults(int a)出错,索引1越界,hql执行不了等等问题
    Mysql 5.6以上版本zip安装方法
    Hibernate5生成的映射文件导致findByExample无法正确查询到结果
  • 原文地址:https://www.cnblogs.com/huahua12/p/8530665.html
Copyright © 2011-2022 走看看