传输层的作用:
传输层主要提供不同主机上的进程之间的逻辑通信(端口到端口的通信),即使在不可靠的网络层(主机之间的逻辑通信)传输下,传输层也能提供可靠的传输。
传输层能够提供面向连接服务的可靠传输,也可以提供无连接服务的不可靠传输,二者本质区别在于通信双方在通信前,是否需要建立连接
面向连接的服务:TCP
在TCP/IP协议栈中,在网络层使用了这两种协议服务,而在传输层,由TCP协议也提供了面向连接的可靠传输服务,它不提供广播和组播机制,但它包括数据发送确认、重传、流量控制、计时定时器、连接管理等,从而使用TCP协议在一些可靠性要求高的传输场合大量使用,因此其多用于大文件的传输,例如:http等。但为了保证传输的可靠性,需要建立连接,在时间上会有延长。
无连接的服务:UDP
在传输层也提供了UDP协议,用于进行非连接的不可靠传输,它在网络层之上仅提供了多路复用和数据差错检查服务。
使用UDP协议的服务,在传输数据时,不需要建立连接,执行速度快,实时性好,但数据传输不可靠,特别对大文件或需要保持连接的服务,因此其多用于小文件的传输,例如DNS解析服务等。
TCP:传输控制协议
TCP协议解决数据传输过程中的可靠、有序、无丢失和不重复的问题,其特点如下:
- 是面向连接的传输层协议
- 是端对端的,即可应用进程到应用进程,只能一对一连接
- 可靠的交付服务
- 无差错
- 无重复
- 有序
- 面向字节流
TCP报文格式
TCP报文分为TCP首部和数据两部分,其报文格式如下:
源端口: 识别发送端口,占16bit
目的端口: 识别接收端口,占16bit
序列号 : seq序号,序列号指的是报文中第一个字节的编号,而不是报文的编号 建立TCP连接时,双方随机选择序列号。占32bit
确认号 : ack确认号,指期望接受的seq序列号,累积确认(该序列号之前的所有字节均已被正确接受到)。占32bit
- 期望接收到的数据的起始序列号,通过情况下为已收到的数据字节长度加1
- 如果含有同步标志位(SYN),则此为最初序列号
- 如果没有同步标志位(SYN),则此为第一个数据比特的序列号
数据偏移: 报头长度, 以4字节为单位计算出的数据段开始地址的偏移值
保留: 必须为0
标志位:
-
URG —为1表示高优先级数据包,紧急指针字段有效
-
ACK —为1表示确认号字段有效
-
PSH —为1表示是带有 PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满(很少使用)
-
RST —为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求
-
SYN —为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
-
FIN —为1表示发送方没有数据要传输了,要求释放连接
窗口(WIN): 表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小,用于流量控制
校验和: 对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段
紧急指针: 本报文段中的紧急数据的最后一个字节的序号。
**选项字段:**最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。
UDP:用户数据报协议
UDP数据报有两个部分组成,分为UDP首部和用户数据。首部部分有8个字节,4个2字节的字段组成,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中
UDP数据报文格式
checkSum校验和表示简单的校验和来进行差错检测。有错就丢弃。该字段是可选的
UDP数据报首部和伪首部和IP数据报之间的关系:
传输层的寻址最重要的就是进程的端口
发送数据时应用层的应用进程的数据通过端口向传输层传递数据
接收数据时传输层把接收到的数据通过端口传递到对应的应用层的应用进程
端口号:
用于标识应用进程的数字标识( /etc/services用于存放系统默认的应用程序端口号),长度为16bit,能够标识216个不同的端口 0-65535 共65536个,只在本地有意义,即只标识本地计算机应用进程
端口号分为两类
知名端口:
- 0-1023,由IANA指派给TCP/IP重要应用进程,固定,不能随便使用。
非知名端口:
- 服务端 1024-49151,需要给IANA注册登记
- 客户端 49152-65535,是客户端进程运行成功后动态选择的
套接字(socket)=(host ip+port):