传输层协议
TCP:一种面向连接的,可靠的传输层通信协议,由IETF的RFC/93定义。
UDP:一种简单的无连接的传输层协议,由IETF的RFC 768定义。
TCP报文
- TCP头部默认20Byte(160个bit)
- 接口一次只能发送1500个字节,MTU=1500
- TCP头部最长是60个Byte
报文内容简介
- Source port(16):源端口
- Destination port(16):目的端口
- Sequence number(32):序列号,发出来的数据的编号
- Acknowledgement number(32):确认号,收到了第几个报文(表示下一个报文应该从哪个序列号开始发送。)
- Header length(4):头部长度,解封装时可以根据头部长度来确定TCP头部的范围是从哪里到的哪里
- Reserved(6):保留字段,没有开发,没有什么用
- Options:补充功能,可以添加其他的功能(认证,密码),0-40个Byte
- Window(16):滑动窗口,用来做流量控制,管理当前传输量
- Checksum(16):校验和,看看数据和之前的是否一样
- Urgent(16):紧急指针位,接到这个时,需要尽快送到上层
- Control bits(6):通常叫做flag位,标志位。可以容纳6个bit,里面的值代表开关,1则代表开启;
- ACK:确认序号有效标识,只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。确认连接
- RST:重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因)然后再重新建立连接。重新连接
- SYN:同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。建立连接
- FIN:发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的数据已经发送完毕。拆除连接
- PSH:标识应该尽快将这个报文段交给应用层。
- URG:紧急指针有效表示。它告诉系统此报文段中有紧急数据,应尽快传送
TCP的建立-三次握手
- 任何基于TCP的应用,在发送数据之前,都需要由TCP进行“三次握手”建立连接。
- TCP连接建立的详细过程如下:
- 由TCP连接发起方(图中PC1),发送第一个SYN位置1的TCP报文。初始序列号a为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为0 ;
- 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号b为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为a+1;
- PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认序列号为b+1。PC2收到之后,TCP双向连接建立。
TCP的序列号与确认序列号
- TCP使用序列号和确认序列号字段实现数据的可靠和有序传输。
- 序列号 对面的确认号是多少,自己的序列号就是多少(如果通过计算来得到自己的序列号,那么就跟上次自己的序列号加上报文长度;注意:如果在三次握手以及四次挥手中,出现syn或者fin也要+1)
- 确认号 根据对面的包做确定(对面的序列号+【如果有syn或者fin则+1】 +报文长度)
假设PC1要给PC2发送一段数据,传输过程如下:
- PC1将全部待TCP发送的数据按照字节为单位编上号。假设第一个字节的编号为“a+1”,第二个字节的序号为“a+2”,依次类推。
- PC1会把每一段数据的第一个字节的编号作为序列号(Sequence number),然后将TCP报文发送出去。
- PC2在收到PC1发送来的TCP报文后,需要给予确认同时请求下一段数据,如何确定下一段数据呢?序列号( a+1 )+载荷长度=下一段数据的第一个字节的序号(a+1+12)
- PC1在收到PC2发送的TCP报文之后,发现确认序列号为“a+1+12” ,说明“a+1”到“a+12”这一段的数据已经被接受,需要从“a+1+12”开始发送。
为了提升发送效率,也可以一次性发送多段数据,由接收方统一确认。
TCP的窗口滑动机制
- TCP通过滑动窗口机制来控制数据的传输速率
- MSS就是一个窗口可以存储多少字节,默认是1460字节
- 如果第二个窗口传输错误,那么从第二窗口往后都需要重新传输
- 看对面剩几个空格,就发送几个空格
- 在TCP三次握手建立连接时,双方都会通过Window字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)。
- 连接建立成功之后,发送方会根据接受方宣告的Window大小发送相应字节数的数据。
- 接受方接受到数据之后会放在缓冲区内,等待上层应用来取走缓冲的数据。若数据被上层取走,则相应的缓冲空间将被释放。
- 接收方根据自身的缓存空间大小通告当前的可以接受的数据大小( Window )。
- 发送方根据接收方当前的Window大小发送相应数量的数据。
TCP的关闭-“四次挥手”
- 当数据传输完成,TCP需要通过“四次挥手”机制断开TCP连接,释放系统资源。
TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。如图所示:
- 由PC1发出一个FIN字段置”1 ”的不带数据的TCP段;
- PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文。
- 若PC2也没有需要发送的数据,则直接发送FIN置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位的TCP报文去关闭连接。
- PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。
UDP报文
- 无连接的服务
- 一般视频语音聊天需要使用UDP
- UDP报文头部:
- Source Port:源端口,标识哪个应用程序发送。长度为16比特。
- Destination Port:目的端口,标识哪个应用程序接收。长度为16比特。
- Length:该字段指定UDP报头和数据总共占用的长度。可能的最小长度是8字节,因为UDP报头已经占用了8字节。由于这个字段的存在,UDP报文总长不可能超过65535字节(包括8字节的报头,和65527字节的数据)。
- Checksum:覆盖UDP头部和UDP数据的校验和,长度为16比特。
地址解析协议(ARP)
- 已知IP求MAC的过程
- ARP基于数据链路层工作
- Address Resolution Protocol 地址解析协议
- 华为查看mac表: arp -a
ARP(Address Resolution Protocol,地址解析协议)是根据IP地址获取数据链路层地址的一个TCP/IP协议。
ARP是IPv4中必不可少的一种协议,它的主要功能是:
将IP地址解析为MAC地址;
维护IP地址与MAC地址的映射关系的缓存,即ARP表项;
实现网段内重复IP地址的检测。(免费ARP)