传输层概述
传输层概述
TCP协议特点:面向连接、字节流、可靠传输
面向链接:
1.使用TCP协议的双方必须先建立连接,并且双方都必须分配相应的内核资源。TCP的连接是全双工的,也就是说双方可以根据一个连接进行读写操作。
字节流:
1.当发送方应用多次进行写操作的时候,TCP发送模块会先把数据放在发送缓冲区中,当TCP发送模块真正发送的时候,这些在发送缓冲区中的数据才可能被封装成一个或多个报文段发出。所有根据以上结论,应用程序执行的写操作的次数和TCP发送的报文段个数没有对应的数量关系。
2.当接收端收到一个或多个报文段数据后,TCP模块必须把它们携带的应用层数据必须按照报文段序号把它们放到TCP接受缓冲区中。同时通知应用程序读取数据,这样应用程序就可以一次读出数据或多次读出数据,这取决于应用程序读缓冲区的大小。根据以上结论得出,TCP读取操作的次数跟接收报文段个数也没有固定的关系
总结:发送端执行的写操作次数与接受端的读操作次数没有任何数量关系,应用程序的发送和接收是没有边界限制的,UDP就不是这样,在这里不详细说了
如图TCP字节流服务过程:
以上就是字节流服务过程:
从图中我们就可以看见,发送短调用的发送次数,和接收短的接受次数并不一样。所有的数据都是先进入缓冲区,在进行操作。封装成报文段进行发送或接收。
可靠传输
TCP协议是可靠的传输协议,支持这种可靠传输的机制有:
- 发送应答机制:也就是说发送端发送的每个数据报文段都必须得到接收方的应答。
- 超时从穿机制:也就是说发送端在发送报文段数据后,本身就启动计时器,如果在规定时间内没有接到接受端的应答,那么就会重新发送这段数据。
要了解TCP在整个TCP协议栈中的作用我们需要分析一下TCP头部结构:
- 头部结构出现在每个TCP报文段中
- 头部结构包括20个字节的固定结构和40个字节的头部选项字段
- 16位源端口:该报文段数据来自哪里?
- 16位目的端口:该报文段数据传给哪个上层协议或应用程序。客户端基本使用临时端口号,而服务器选择知名的服务端口号,在Linux下,所有的知名服务端口号都定义在/etc/services文件夹下。
HTTP服务端口号为80,DNS服务端口号为53,FTP服务器端口为21。 - 32位序号:在tcp一次通信中(从建立连接到断开),在TCP协议在发送数据时会根据实际传输能力把数据分割成若干数据段,这32位序列号就是为这个数据段打上标记。
- 32位确认号:如果接收端没有接收到某一段数据会告诉发送端:“我没收到这段数据 请重新发送” 所以用确认号能保证数据的完整性
- 4位头部长度:标识有多少个4字节
- URG:紧急指针是否有效
- ACK:表示确认号是否有效
- PSH:提示接收端应用程序应该立即从接收缓冲区中读取数据,为接收后续数据腾出空间。
- RST:要求对方重新建立连接。
- SYN:请求建立一个连接
- FIN:同对方本端要关闭连接。
- 16位窗口大小:TCP流量控制。
- 16位校验和:接受端对tcp数据进行CRC算法检验tcp报文段在发送的过程中属否损坏。(包括数据部分)
- 16位紧急指针:表示最后一个紧急数据的下一字节的序号。
- 头部选项:最多包涵40个字节
1.kind:说明选项类型。
2.length:表示该选项的总长度。
3.info:选项的具体信息。
kind类型如图所示: