TCP/IP协议

TCP/IP协议简介

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。
TCP/IP协议参考模型:

  • 分为四个层次:数据链路层
TCPIP协议描述
应用层HTTP FTP
传输层TCP UDP
网络层IP协议:负责对数据加上IP地址和其他的数据以确定传输的目标
数据链路层为待传的数据加入一个以太网协议头,并进行CRC编码,为数据传输做准备

TCP/IP协议通信过程:
对应着数据入栈和出栈的过程。
入栈:数据发送方每层不断的封装首部和尾部,添加一些传输的信息,确保能传输到目的地。
出栈:数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。

数据链路层

原理:物理层负责0,1比特流与物理设备电压高低、光的闪灭之间的互换。
详解:数据链路层负责将0,1序列划分为数据帧从一个节点传输到临近的另一个节点,这些节点是通过MAC来唯一标识的。
功能:

  1. 封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址
  2. 透明传输:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。
  3. 可靠传输:采用一系列技术来保障信息在发送方和接收方准确、精确的传输。在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输
  4. 差错检测(CRC): 接收者检测错误,如果发现差错,丢弃该帧。

网络层

IP协议:

所有的TCP、UDP、IMCP、IGMP的数据都以IP数据格式传输。
注意:IP是不可靠协议,即,IP协议没有提供一种数据未传达以后的处理机制,而是让上层协议TCP或UDP处理。

IP地址划分
数据链路层中是通过MAC地址识别不同节点,在IP层的地址标识是IP地址。

32位IP地址 = 网络号 + 地址位
这样划分的目的:减少路由器中路由表记录的数目
网络地址:可以限定拥有相同网络地址的终端在同一个范围内,路由器只需要维护一条这个网络地址的方向就可以找到其终端了。
IP分类

  • A类IP地址: 0.0.0.0 ~ 127.255.255.255
  • B类IP地址: 128.0.0.0 ~ 191.255.255.255
  • C类IP地址: 192.0.0.0 ~ 239.255.255.255
  • D类IP地址:

IP数据报的完整格式
一个IP数据报有首部和数据两部分组成。首部前一部分是固定长度,20字节;可选字段的长度是可变的
在这里插入图片描述

ARP及RARP协议

ARP:地址解析协议,根据IP地址获取MAC地址的一种协议
主机是不知道这个ip对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(IP-MAC地址对应表缓存)
如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机。

而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

RARP协议的工作与此相反,不做赘述。

IPMP协议

IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议。

当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

PING

ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

Traceroute

Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。

Traceroute的原理是非常非常的有意思,它收到到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。

DNS

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

运输层协议

进程之间的通信
网络的边缘部分的两个主机使用网络的核心部分的功能进行端到端通信时,只有主机的协议栈才有运输层,网络核心部分中的路由器在转发分组时只用到下三层的功能
端到端的通信是应用进程之间的通信。
运输层的作用
复用(multiplexing):指在发送方不同的应用进程都可以使用同一个运输层协议传送数据
分用(demultiplexing):指接收方的运输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
运输层和网络层区别
网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信;
运输层要对收到的报文进行差错检测

运输层两个协议主要的协议:TCP、UDP

UDP协议

  • 用户数据报协议UDP(User Datagram Protocol)
    主要应用:DNS/TFTP/RIP/BOOTP/DHCP/SNMP/NFS/IGMP
  • 特点:
    1. 无连接
    2. 使用尽最大努力交付(即,不保证可靠交付)
    3. 面向报文:应用层交给UDP多长的报文,UDP就照样发送,既不合并也不拆分
      若报文太长,IP层传送时要进行分片。因此应用进程要选择合适大小的报文
    4. UDP首部开销小,只有8字节,比TCP的20字节要短
  • UDP数据包组成:数据字段、首部字段
    首部字段共8字节:源端口、目的端口、长度、检验和
  • 端口不可达
    如果接收方UDP发现报文中的目的端口号不正确(不存在对应于该端口号的应用进程),就丢弃该报文并由ICMP发送端口不可达差错报文给发送方
  • 伪首部:只有在计算检验和时,临时添加在UDP用户数据报前面的数据,由此计算检验和。伪首部既不向下传送,也不向上递交。

TCP协议

  • 应用:SMTP/TELNET/HTTP/FTP

  • 特点:
    1.面向连接的运输层协议
    2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
    3.TCP提供可靠交付的服务
    4.提供全双工通信
    5.面向字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。

  • TCP根据对方给出的窗口值和当前网络拥塞程度来决定一个报文段应包含多少个字节

  • TCP连接的端点是套接字,即(IP地址:端口号)

  • 停止等待协议
    “超时重传”:A只要超过一段时间没有收到确认,就认为刚才发送的分组丢失了,因而重传签名发送过的分组。
    需要设置超时计时器
    对于迟到的确认,B会(1)丢弃这个重复的分组M2,不向上层交付。(2)向A发送确认
    缺点:信道利用率太低

  • 连续ARQ协议
    定义:发送方每收到一个确认,就把发送窗口向前滑行一个分组的位置。接收方一般都采用累计确认的方式。
    即:接收方在收到几个分组后,对按序到达的最后一个分组发送确认。表示到这个分组为止的所有分组都已经正确收到了。

  • TCP报文格式

三次握手

TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。在这里插入图片描述
具体流程:
1.最初状态:A和B的TCP进程都处于CLOSED状态
2.B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客户的连接请求
3.A的TCP客户进程创建传输控制模块TCB,然后向B发出连接请求报文段,首部的同部位SYN=1,同时选择一个初始序号seq=x
这时,TCP客户进程进入SYN-SENT(同步已发送)状态
4.B收到连接请求后,如果同意建立连接,则向A发送确认。确认报文中SYN=1,ACK=1,确认号ack=x+1
同时选择一个自己的初始序号seq=y,服务器进程进入SYN-RCVD(同步收到)状态。
5.TCP客户端收到B的确认后,还要向B发送确认,确认报文ACK=1,确认号ack=y+1,自己的序号seq=x+1。这时,TCP连接建立,A进入ESTABLISHED状态
6.B收到A的确认后,也进入ESTABLISHED状态

四次挥手


具体流程:
1.初始状态:A和B都处于ESTABLISHED状态
2.A先向TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接。报文段中FIN=1,序号seq=u(已传送过的数据的最后一个字节的序号加1),这时A进入FIN-WAIT-1(终止等待1)状态,等待B确认。
3.B收到释放报文后即发出确认,确认号ack=u+1,字节序号是v(B前面已传送数据最后一个字节序号+1),B进入CLOSE-WAIT(关闭等待)状态。 这时的TCP处于半关闭状态。即:从B到A的方向的连接并未关闭。
4.A收到确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段
5.若B没有需要发送的数据,就通知TCP释放连接,FIN=1,选择序号w,ack=u+1,此时B进入LAST-ACK(最后确认)状态
6.A收到B的连接释放报文段后,必须对此发出确认,ACK=1,ack=w+1,seq=u+1,A进入TIME-WAIT(时间等待)状态
7.经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A进入CLOSED状态

  • 四次分手的原因
    TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

  • FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。(主动方)

  • FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)

  • CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)

  • LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

  • TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FINWAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)

  • CLOSED: 表示连接中断。

为什么握手是三次,挥手是四次?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

TIME-WAIT状态为什么必须等待2MSL时间?

MSL(最大报文段生存时间)

  1. 为了保证A发送的最后一个ACK报文段能够到达B。(B收不到A发送的ACK时会重传关闭的报文,因此A需要等待其发送的ACK是否成功)
  2. 防止已失效的连接请求报文段出现在本连接中。
为什么不能用两次握手

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
如果使用两次,可能会出现死锁的现象。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

TCP流量控制

  • 定义:让发送方的发送速率不要太快,要让接收方来得及接收。
  • 滑动窗口实现流量控制
    发送方的发送窗口不能超过接收方给出的接收窗口的数值。(TCP的窗口单位是字节,不是报文段)
  • 解决死锁:TCP为每一个连接设一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节数据),对方就在确认这个探测报文段时给出现在的窗口值。

TCP拥塞控制

  • 定义:计算机网络中的带宽、交换节点的缓存和处理机等都是网络资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况叫拥塞。
  • 简单的通过增加一些资源,比如把结点缓存的存储空间扩大,或把链路更换为更高速率的链路,或把结点处理机的运算速度提供,并不能解决网络拥塞问题。
    因为问题的实质是整个系统的各个部分不匹配,只有所有部分都平衡了,问题才能解决。
  • 拥塞控制的四种算法:满开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)

参考:《程序员小灰》https://blog.csdn.net/bjweimengshu/article/details/79214572

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值