概述

传输层用于高效的传输应用数据,并且能控制不同协议的通信要求。TCP提供可靠的通信传输,UDP则是让广播和细节控制交给应用。

端口号

识别同一台计算机中进行通信的不同应用程序,因此,也称为程序的地址。 516c200786d82984db9f3349cc1b6516 5a224fe56a99299b264b42befa44866e

分配端口号

  • 知名端口号一般由0-1023的数字,还有一些端口号也被注册1024-49151,应用程序应该避免使用知名端口号,注册的端口号可以用(待验证)

TCP知名端口号举例: ftp 21 ssh 22 telnet 23 http 80 https 443 mysql 3306 redis 6379

UDP知名端口号举例: echo 7 daytime 13 DNS 53 tftp 69 router 520

  • 时序(动态)分配法 服务器需要确定监听端口号,客户端不需要自己设置端口号,都是操作系统进行分配的,windows取值范围在49152-65535,linux则是32768-61000。
  • 端口号由其使用的传输层协议决定,因此,不同的传输层协议可以使用相同的端口号,如TCP和UDP可以使用同一个端口号,数据到达IP层后,检测IP首部的协议类型,再传给相应协议的模块处理,再传给相应的应用层。

    TCP

    tcp提供一种面向连接的,可靠的字节流服务。 2a3312568f165f5d0bd25a8410b76722 连接建立后,应用程序只使用这个虚拟的通信线路发送和接收数据,就可以保证信息的传输,不用顾虑IP网络上可能发生的各种问题。TCP则负责控制连接的建立,断开,保持等管理工作。

保证可靠性

tcp通过对包体检验和检测,包序列号,确认应答,重发控制,连接管理及窗口控制等机制实现可靠传输。

  • 应用数据被分割成tcp认为最适合发送的数据包单位(MSS最大消息长度)。MSS是在发送建立连接请求时,在TCP首部写入MSS选项,告诉对方自己的MSS大小,在两者之间选择较小的值使用。 caa1f0ea2baea89710fb98ffbfb46eac

  • 当tcp发出一个段(tcp传递给IP的信息单位称为报文段或段)后,启动一个定时器,等待目的端确认收到这个报文段,如果超时,则重发这个报文段。 丢包重发原因:

1.发送时丢 f610187bd4644d1662d108a698bbf0ae 2.回复时 d9090dbb727d1b550617cddcc00cd428 重发超时时间确认:

1.每次发包时会计算往返时间(RTT,报文段往返时间)及偏差(RTT时间波动的值,方差,也叫抖动),因为数据包的分段是经过不同线路到达,时间也会有偏差。

2.在bsd的unix和windows系统中,超时都是0.5s为单位进行控制。数据重发后还是收不到确认应答,则进行再次发送,等待确认应答的时间将会以2倍,4倍的指数延长。

3.数据发送达到一定重发次数后,如果还是没任何确认应答,就会判断网络或对端异常,强制关闭连接,并通知应用层。

  • 当tcp收到从另一端tcp连接发来的数据,将发送一个确认。
  • tcp将保持它的首部和数据的校验和(检测数据在传输过程中的任何变化),如果收到段的检验和有差错,则丢弃这个报文段和不确认收到此报文段,导致发送端超时重发。
  • 把每一个发送字节都编上序号,接收端查询接收数据TCP首部中的序列号和数据的长度,将下一步要接收的序号作为确认应答返回。通过序列号和确认应答号,实现可靠传输。
  • 由于IP数据报到达可能失序,TCP报文段到达也可能失序,TCP将对收到的数据进行重新排序,将正确的顺序交给应用层。
  • 流量控制,TCP接收端只允许发送接收端缓冲区所能接纳的数据。接收端主机向发送端主机通知自己可以接受数据的大小,该大小限度就是窗口大小。当接收端缓冲区一旦面临数据溢出时,窗口大小也会随之被设置为一个更小的值通知发送端,从而控制数据发送量。 f3b3dad4e90eb761c6b32ec1f065836e

MTU和MSS

MTU(Maximum Transmission Unit)最大传输单元,指的是网络层中的数据大小,包括IP报头,以太网默认MTU为1500字节。 MSS(Maximum Segment Size)最大报文段长度,指的是应用程序的数据大小,以太网MSS等于MTU-40=1460字节。 1b2dac5582fd7a125148aed829614203

TCP缓冲区

参考:https://blog.csdn.net/lclwjl/article/details/80434246 3f0e0b19e4cfa1f3421ddd722df3c3ea

  • 每个TCP套接字都有一个发送缓冲区,当应用进程调用write时,内核从该应用进程的缓冲区复制所有数据到所写套接字的发送缓冲区。
  • 如果应用进程的数据大于该套接字的发送缓冲区,则该进程进入睡眠(针对阻塞套接字),内核将不从write系统调用返回,直到应用进程缓冲区中所有数据都复制到套接字发送缓冲区(UDP在这种情况下,内核会返回一个EMSGSIZE错误)。
  • 对于非阻塞TCP套接字,发送缓冲区没有空间时,会返回EWOULDBLOCK错误。 bb4164b3aecaab85d8a56081b33500d6 94ffe5749ba4e4747c11971e3cc93474

TCP 报文格式

b6339744aa2454cae4206c8caae32e56 d6c134fbf77f01caed0e44f69789cd7c

1.源端口和目的端口加上IP首部的源IP地址和目的IP地址(四元组)可以唯一确定一个TCP连接。
2.序号是标识从TCP发送端到TCP收端的数据字节流,表示这个报文段中的第一个数据字节,传输的每一个字节都被计数。
3.TCP收端发送所期望收到的下一个序号,TCP提供全双工服务,因此每一端必须保持每个方向上的传输数据序号。
4.URG 紧急标志,紧急指针有效。
5.ACK 确认序号有效.
6.PSH 将数据交给应用程序的标志. 7.RST 该位为1时,强制断开连接,重建连接的标志。发送一个不存在的端口连接请求。程序宕机或切断电源导致主机重启,会发送一个设置为1的RST包,就会使通信强制断开连接。
8.SYN 同步序号发起一个连接。
9.FIN 发端完成发送的标志。
10.窗口大小 用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小.
11.校验和 链路层的FCS检验出噪声干扰,传输层的校验是对路由器内存故障或程序漏洞导致数据破坏的检查。
12.紧急指针 当URG控制位为1时有效。从数据部分的首位到紧急指针所指示的位置为止为紧急数据。场景有暂停通信,中断通信,如web浏览器中点击停止按钮,或telnet输入ctrl+c时都会有urg为1的包。
13.选项 选项字段用于提高TCP传输性能。格式为:1字节kind字段(选项类型)+1字节len字段(总长度)+选项数据. 59a4bb2b76303889f9286bdf10891f22

  • 类型为2表示MSS(最大报文段长度),3次握手时将MSS填入选项头中进行数据交换,当双方节点的MSS不一样时,取小的那一方。
  • TCP在传送大量数据时是以MSS大小为单位将数据分割发送的。

滑动窗口

  • TCP以1个段为单位,每发一个段进行一次确认应答处理,缺点就是包的往返时间越长通信性能越低。 9f06fa0eced6490562c0f73e9ea3d997
  • 为了提高通信效率,TCP引入了窗口的概念。以更大的单位进行确认应答。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。下图的窗口大小为4个段。 befd98452b325be079c9fcf73d0b8868
  • 滑动窗口 c349b3746e685eb9fac0b00910f7f32f bb235087f09cf57f9002bfc17a60e629

流量控制

接收端收到的数据先是被暂时存放在接收缓冲区,然后才交给应用程序。如果接收端当前是在高负荷情况下,缓冲区数据来不及消耗,导致无法接受任何数据。 TCP提供一种机制,可以让发送端根据接收端实际接收能力控制发送的数据量,这种机制就是流量控制。 接收端向发送端主机通知自己可以接受数据的大小,发送端则会发送不超过这个限度的数据,称为窗口大小。 a7a173977107ec8dbe819eb8b4ce9d9e

拥塞控制

1.网络拥塞一般由于路由器缓存溢出引起的,如果一个数据包到达路由器时,超过路由器的缓存容量,则这个包会被丢弃,那么这个包终将被重传,但是导致通信效率降低。
2.当数据从一个大的管道向一个小的管道发送数据时便会发生拥堵, 4706817e2a85eab107527af18f19426f

计算机网络都处于一个共享的环境,因此会因为其他主机之间的通信使得网络拥堵。 TCP在通信开始就会通过一个叫做慢启动算法得出的数值,对发送数据量进行控制。

  • 将拥塞窗口大小设置为1个数据段发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。
  • 发送数据时,取拥塞窗口和接收端主机通知的窗口大小较小的值发送数据。
  • 随着发送数据的增多,拥塞窗口也会以1,2,4等指数函数增长,也会导致网络拥堵,当超过慢启动阀值时,会降低发送窗口大小。
  • 现象是,TCP通信开始后,网络吞吐量会逐渐上升,但是随着网络拥堵发生,吞吐量会下降,因此TCP的吞吐量的特点就好比是逐步占领网络带宽的感觉。

半关闭

TCP的一端在结束他的发送后还能接受来自另一端数据的能力,这就是TCP的半关闭。应用程序调用shutdown关闭socket时,则可以实现半关闭状态,但是大多数应用程序通过调用close终止两个方向的连接。 9b318b90a8504bbe5e75bfb16f38b008

TCP粘包、拆包

  • 应用程序写入字节大小大于socket缓冲区
  • 滑动窗口较小
  • 进行MSS大小的TCP分段
  • 以太网帧的payload大于MTU进行IP分片
  • 发包nagle算法,将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包

以上原因导致接收端就难于分辨一个包,必须提供科学拆包机制,即面向流的通信是无消息保护边界的。

9ac3fe24cb1749ef69f092bbf3766f9f 由于服务端一次读取到字节数是不确定的,故存在以下四种情况:

1.服务端分两次读取到了D1和D2,没有粘包和拆包.
2.服务端一次接受到了D1和D2,称为TCP粘包.
3.服务端分两次读取了数据包,第一次读取了完整的D1和D2的部分内容,第二次读取到了D2的剩余内容,称为TCP拆包。
4.服务端分两次读取到了数据包,第一次读取到了D1部分内容,第二次读取了D1包的剩余部分和完整的D2,也是TCP拆包。
5.如果TCP滑动窗口非常小,而数据包D1和D2比较大,服务端分多次才能将D1和D2完全接受,期间发生多次拆包。

  • UDP是无连接,发包不会采用块的合并优化算法,不需要粘包,拆包。

    粘包、拆包问题解决方案

    1.定长协议,假设规定设3个字节表示一个有效报文,如果分4次发送以下9个字节 03a60af9c8db3f88d84708552ded3514 根据协议判断出这里包含了3个有效请求报文 0ac438c908d993a45cb961fb2ecb92f9 2.特殊字符分隔符协议,在包尾增加回车或者空格符等特殊字符进行分隔 25a8949041f293b0b695892e3e5eb0f4 ba1dddad19051f0d612a34c7c278886c 3.长度编码,将消息分为消息头和消息体,先读取内容长度,其值为实际消息体内容占用的字节数,之后必须读取这么多字节内容才认为是一个完整的数据报文。 35a731536a7adb9b0a00e36f69a4c82f

UDP

UDP是面向无连接,不可靠,不提供复杂控制机制的通信服务。因为发送报文段前,没有进行握手,所以UDP称为无连接的协议。

缺点:

  • 没有流量控制,没有拥塞控制
  • 传输途中丢包,UDP也不负责重发
  • 包到达目的地乱序没有重排功能
  • 如果需要这些特征,需要应用程序处理。

优点:

  • 简单高效,无连接。 运用场景:
  • 包总量较少的通信(DNS,DHCP)
  • 视频,音频等多媒体通信(即时通信)
  • 限定于LAN等特定网络中的应用通信
  • 广播通信(广播,多播)

    UDP首部格式

    48887f0b273378053b14ef4f23d01717

1026efa82a619b247cc9658377b818c0

IP分片

  • 以太网的MTU值为1500字节,则TCP的MSS=MTU-40=1460,UDP的MSS=MTU-28=1472。但是并不是所有的数据链路的MTU都是1500,如果数据包在发送过程中,某些路段MTU值偏小,则需要在路由器或防火墙做分片处理。 bb10351eda3353b100021db40a52fbc8

  • IP报头的标志字段DF(dont fragment禁止分片)的值不同,处理方法也不同。

1.DF为0,允许分片的数据包被切分。分片处理会有负荷问题,不过路由器和防火墙的规格都相当高,执行分片处理绰绰有余。 148d58e1acc1ef08fd5e9d8159bb93cc 2.DF为1,表示不可分片。有几种办法可以让数据包发送。

  • 通过ICMP获悉MTU值 ba336e5c4a0d8fcb36a1c9828f71b94d
  • 改写DF位,可以把DF位清0使其允许分片 a56bc2d0f0a1beac6f2a7740164067fc
  • 将MSS的值变小,TCP在3次握手的TCP选项中决定MSS大小,可以改写MSS值变小,就能让报文段的长度保持在出口处接口的MTU值范围之内了。 d59ed3eca3dcc0d575046f49a70c42bd bc6cdf6d8c6c717d2fd07a90874bc10b