一、TCP基础知识
TCP是一种面向连接的、可靠的、基于字节流的通信协议。
TCP通过确认机制、超时重传、滑动窗口确保传输的可靠性。
二、建立连接 - 三次握手
1、Client端发送连接请求
2、Server端收到连接请求后回复ACK报文,并为这次连接分配资源
3、client端收到ACK报文后也向Server端发送ACK报文,并且分配资源。
小结:三次握手完成两个重要功能:1.双方做好发送数据的准备工作。2.双方就初始序列号进行协商。
三、可靠传输 - 确认机制、超时重传、滑动窗口
1、TCP消息头
1)目的端口和源端口:TCP通过源端口和目的端口标识通信双方的应用程序
2)序列号:当一个终端开启一个TCP会话时,他的序列号会被初始化为某一个随机数ISN,TCP报文后续的序列号等于ISN+发送的数据的偏移值。比如某一个TCP报文端发送的数据是1025 - 2048那么该序列号为ISN + 1025
确认号:用作对另一方发送来的TCP报文段的响应(确认包)其值是收到的TCP报文段的序号+1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
头部长度:标志TCP头部有多少个4字节。4位最大能标识15,即TCP头部最长为60字节。
标志位:
◆URG:紧急指针(urgent pointer)有效。
◆ACK:为1时,确认序号有效。
◆PSH:为1时,接收方应该尽快将这个报文段交给应用层。
◆RST:为1时,要求对方重新建立连接。
◆SYN:为1时,同步程序,请求建立一个连接。
◆FIN:为1时,通知对方本端要关闭连接了。
窗口大小:此字段进行流量控制,单位为字节,这个值是本端接收缓存区还能容纳多少字节的数据
校验值:发送端对整个TCP报文进行CRC算法计算,并且由接收方验证
紧急指针:它是一个偏移量,和序号字段中的值相加表示最后一个紧急数据的下一字节的序号。紧急指针是发送方向接收方发送紧急数据的方法。
TCP选项:占32比特。可能包括”窗口扩大因子”、”时间戳”等选项
2、可靠传输流程
1)流量控制。TCP传输双方都有一个固定大小的缓冲空间。TCP接收方不允许发送方发送超过缓冲空间的数据。这将防止快慢机的问题。
2)分包传输。TCP将数据分割成合适的数据块进行传输。
3)确认机制和超时重传。TCP发送一个数据块时会启动一个定时器,等待接收方发送的确认。如果超时没有收到确认将会重发数据块。
4)计算校验和。TCP接收方收到一个数据后会计算校验和。目的是检测数据传输过程中是否有什么变化。如果校验和有问题将丢弃该数据块等待发送方超时重发。
5)重新排序和过滤重复数据。数据块在传输过程中可能失序,接收方收到数据后会按照正确的顺序排序。数据可能重复,接收方会过滤掉重复的数据。
四、释放连接 - 四次挥手
1)Client发送一个FIN用来关闭Client到Server的数据发送,Client进入FIN_WAIT_1状态
2)Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态
3)Server发送FIN后,用来关闭Server到Client的数据发送,Server进入LAST_ACK状态。
4)Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手
5)数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
①因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
②但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
③只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
OSI七层模型:
应用层:(直接为应用程序提供服务)。常见的应用层的网络服务协议有:HTTP、HTTPS、FTP、POP3、SMTP。
示例:A公司向B公司发送一个文件。
表示层:( 编码、格式转换、数据压缩、加密)提供应用层编码和转换的功能,确保一个系统的应用层发送的数据可以被另一个系统应用层识别。如果必要该层可以提供一种标准表示形式。用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层的功能之一。
示例:A公司和B公司分属于不同的国家,所以约定文件使用英语。所以表示层需要将文件翻译成英文版的。为了信息安全有将文件加密。
会话层:利用传输层的服务,使应用建立和维持会话,并能使会话获得同步。
示例:会话层拿到表示层的同事处理后的资料,会话层将建立并记录本次会话,找到公司B的地址。然后将资料放进信封、写上地址和联系方式。准备将资料寄出。等到确认B公司收到文件后本次会话结束。终止本次会话。
传输层:传输层的作用是为上层服务提供端到端的、可靠的、透明的数据传输服务。包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节。TCP、UDP工作在这一层。
示例:传输层将会话层准备好的邮件投递到快递公司。
网络层:通过IP寻址来建立两个节点之间的连接。选择合适的路由和交换节点,准确无误的的按照地址传送给目的端。向传输层提供基本的端到端的服务。
示例:快递公司将资料从A公司送给B公司的过程。以深圳发往北京的为例。首先到深圳集散中心、然后再到武汉集散中心、然后再到北京集散中心,每个集散中心都相当于网络中的一个节点。
数据链路层:使用链路层地址(MAC地址)将数据可靠的传输到相邻节点的目标即网络层。
示例:从深圳集散中心传输到武汉集散中心。
物理层:实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。