[关闭]
@mrz1 2017-12-20T11:42:16.000000Z 字数 6432 阅读 864

2017-12-11课程笔记( 待完成... )

笔记


UTP交叉线(Crossover)
UTP直通线(Straight-Through)

Hub集线器(repeater)

Hub:多端口中继器(中继器相当于信号放大器)
Hub并不记忆该信息包是由哪个MAC地址发出,哪个MAC地址在Hub的哪个端口

Hub的特点:
共享带宽
半双工

Hub集线器

单工 单线传输
半双工 相当于对讲机
全双工 视频通话

以太网桥的工作原理

  1. 以太网桥监听数据帧中源MAC地址,学习MAC,建立MAC表对于未知MAC地址,网桥将转发到除接收该帧的端口之外的所有端口
  2. 当网桥接到一个数据帧时,如果该帧的目的位于接收端口所在网段上,它就过滤掉该数据帧;如果目的MAC地址在位于另外一个端口,网桥就将该帧转发到该端口
  3. 当网桥接到广播帧时候,它立即转发到除接收端口之外的所有其他端口以太网桥的工作原理
    以太网桥的工作原理

Hub和交换机比较

  1. 集线器属于OSI的第一层物理层设备,而网桥属于OSI的第二层数据链路层设备
  2. 从工作方式来看,集线器是一种广播模式,所有端口在一个冲突域里面。网桥的可以通过端口隔离冲突
  3. Hub是所有共享总线和共享带宽。网桥每个端口占一个带宽
    Hub和交换机比较

路由器

路由器

为了实现路由,路由器需要做下列事情:
分隔广播域
选择路由表中到达目标最好的路径
维护和检查路由信息
连接广域网

route print 查看Windows路由表
route -n 查看linux路由表
路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成路由

VLAN

VLAN

分层的网络架构

架构

集线器工作在物理层
交换机工作在数据链层
路由器工作在网络层
网卡是数据链层

TCP/IP 协议栈

  1. Transmission Control Protocol/Internet Protocol传输控制协议/因特网互联协议
  2. TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
  3. 最早发源于美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护
  4. 共定义了四层
  5. 和ISO参考模型的分层有对应关系

TCP/IP 协议栈和OSI 模型

TCP/IP 协议栈和OSI 模型

TCP/IP 应用层

TCP/IP 应用层

传输层

传输层

  1. Session multiplexing
  2. Segmentation
  3. Flow control (when required) 非面向连接 例:讲课你爱听不听,反正我讲了 你听不听是你的事
  4. Connection-oriented (when required)面向连接 通讯前是否有稳定的状态
  5. Reliability可靠 (when required)不可靠 例:视频聊天 看直播

可靠性 VS 高效性

TCP/UDP

TCP特性

工作在传输层
面向连接协议
全双工协议(双向同事传输数据)
半关闭(单方面关闭 例:单方分手对方没同意)
错误检查
将数据打包成段,排序
确认机制(你发的第100包,确认机制会说希望你发第101包)
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算法

TCP包头

TCP包头

数据链层首部 -> 网络层首部-> 传输层首部(TCP) ->应用层首部 -> 数据

  1. 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机 端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16=0-65535=65536个cat /etc/services被占用常见端口号
  2. 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始
  3. 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号
  4. 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出TCP 报文段的数据起始处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
  5. URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
  6. ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
  7. PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
  8. RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
  9. SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
  10. FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
  11. 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量
  12. 校验和:提供额外的可靠性
  13. 紧急指针:标记紧急数据在数据字段中的位置
  14. 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
    常见选项:
    最大报文段长度:MaxiumSegment Size,MSS
    窗口扩大:Windows Scaling
    时间戳:Timestamps

TCP包头选项

  1. 最大报文段长度
    指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS写入这一字段。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中
    80TCP包头选项
  2. 窗口扩大为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项
  3. 时间戳可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文

映射第四层到应用程序

TCP包头

TCP协议PORT

传输层通过port号,确定应用层协议
Port number:(端口号)
tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路0-65535
udp:User Datagram Protocol,无连接的协议0-65535
IANA:互联网数字分配机构(负责域名,数字资源,协议分配)
0-1023:系统端口或特权端口(仅管理员可用),众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)
1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer),1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp(memcached)
49152-65535:动态端口或私有端口,客户端程序随机使用的端口其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

  1. [root@centos7 ~]#cat /proc/sys/net/ipv4/ip_local_port_range
  2. 32768 60999

TCP三次握手

TCP三次握手

参考具体链接

TCP半连接和SYN攻击

TCP四次挥手

TCP四次挥手

service httpd start 打开httpd服务
service httpd stop 关闭服务

有限状态机FSM:Finite State Machine

CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING 双方同时尝试关闭传输连接,等待对方确认

有限状态机

客户端先发送一个FIN给服务端,自己进入了FIN_WAIT_1状态,这时等待接收服务端的报文,该报文会有三种可能:
只有服务端的ACK
只有服务端的FIN

基于服务端的ACK,又有FIN

  1. 只收到服务器的ACK,客户端会进入FIN_WAIT_2状态,后续当收到服务端的FIN时,回应发送一个ACK,会进入到TIME_WAIT状态,这个状态会持续2MSL(TCP报文段在网络中的最大生存时间, RFC 1122标准的建议值是2min).客户端等待2MSL,是为了当最后一个ACK丢失时,可以再发送一次。因为服务端在等待超时后会再发送一个FIN给客户端,进而客户端知道ACK已丢失
  2. 只有服务端的FIN时,回应一个ACK给服务端,进入CLOSING状态,然后接收到服务端的ACK时,进入TIME_WAIT状态
  3. 同时收到服务端的ACK和FIN,直接进入TIME_WAIT状态

客户端的典型状态转移

客户端通过connect系统调用主动与服务器建立连接connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态
此后connect系统调用可能因为如下两个原因失败返回:

  1. 如果connect连接的目标端口不存在(未被任何进程监听),或者该端口仍被处于TIME_WAIT状态的连接所占用(见后文),则服务器将给客户端发送一个复位报文段,connect调用失败。
  2. 如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。

connect调用失败将使连接立即返回到初始的CLOSED状态。如果客户端成功收到服务器的同步报文段和确认,则connect调用成功返回,连接转移至ESTABLISHED状态

客户端的典型状态转移当客户端执行主动关闭时,它将向服务器发送一个结束报文段,同时连接进入FIN_WAIT_1状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至FIN_WAIT_2状态。当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入TIME_WAIT状态

客户端从FIN_WAIT_1状态可能直接进入TIME_WAIT状态(不经过FIN_WAIT_2状态),前提是处于FIN_WAIT_1状态的服务器直接收到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段)

处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)

Linux为了防止孤儿连接长时间存留在内核中,定义了两个内核参数:
/proc/sys/net/ipv4/tcp_max_orphans指定内核能接管的孤儿连接数目
/proc/sys/net/ipv4/tcp_fin_timeout指定孤儿连接在内核中生存的时间

有限状态机

有限状态机

TCP协议中的三次握手和四次挥手

TCP协议中的三次握手和四次挥手

客户机端的三次握手和四次挥手

客户机端

服务器端的三次握手和四次挥手

服务器端

TCP超时重传

  1. 异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务
  2. TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略
  3. 与TCP超时重传相关的两个内核参数:
  4. /proc/sys/net/ipv4/tcp_retries1,指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
  5. /proc/sys/net/ipv4/tcp_retries2,指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~30min)

TCP确认(滑动窗口)

滑动窗口

拥塞控制

  1. 网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。这种情况就叫做拥塞
  2. TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制
  3. TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)。拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分
  4. 当前所使用的拥塞控制算法/proc/sys/net/ipv4/tcp_congestion_control

UDP包头

工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性

UDP包头

源端口-目标端口-UDP报文长度-校验位-数据

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注