一、TCP/IP协议
在计算机发展的初期,各种各样品牌的电脑运行着各自不同的操作系统,仿佛始皇帝一统天下前的六国一样,虽然大家都用着本质相同的语言(二进制),却有着各自听不懂对方说什么。于是人们设定了全新的统一标准,让电脑可以在物理上连接起来。
物理上的连接是不够的,TCP/IP协议的出现就是语言层面解决了两台电脑的数据交流问题。准确来讲,tcp/ip协议不是一个协议,而是一个协议族,里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等
二、TCP/IP的分层
TCP/IP和OSI协议分层的对应,如上图所示。
也存在四层分层,即将五层中的数据链路层和物理层合并为一层,其余保持不变,五层变为四层。
连着存在的关系为,OSI为国际标准,适用范围广,TCP/IP是实际标准基于OSI模型,只适用于TCP/IP网络。
三、TCP特性
TCP/IP协议族可以迅速发展主要原因,是他恰好适应了世界范围内数据通讯的需求,它的主要特点如下:
- 工作在传输层
- 面向连接协议
- 全双工协议
- 半关闭
- 错误检查
- 将数据打包成段,排序
- 确认机制
- 数据恢复,重传
- 流量控制,滑动窗口
- 协议标准是完全开放的,可以供用户免费使用,并且独立于特定的计算机硬件与操作系统。
- 独立于网络硬件系统,可以运行在广域网,更适合于互联网。
- 网络地址统一分配,网络中每一设备和终端都具有一个唯一地址。
- 高层协议标准化,可以提供多种多样可靠网络服务。
四、TCP数据段格式
1)源端口/目标端口:
计算机山的进程要和其他进程通讯和其他进程通讯要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是那两个进程需要通训。源端口,目标端口是用16位表示的,可退栓计算机的端口个数位2^16个,即65536个(0—65535)
2)序列号
(Seq)表示本数据段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序。由于序列号由32位表示,所以每2^32字节,就会出现序列号回绕,再次从0开始,无线循环。
3)确认号
(Ack)表示接收方期待收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(发送方)下次发送的数据第一个字节数据的标号为此确认号。
4)数据偏移/首部长度
表示TCP报文段的首部长度,共四位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。他指出TCO报文断电额数据其实处距离TCP报文段的起始处有多远。该字段的单位是32位(即4个字节位计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节。
5)控制位
- URG(紧急位):表示本数据段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
- ACK(确认位):表示是否前面的确认号字段是否有效。只有当ACK=1的时候,前面确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
- PSH(急切位):提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。
- RST(重置位):如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段 。
- SYN(同步位):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。
- FIN(断开位):表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段。
6)窗口大小
表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值。
7)校验和
提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置。
8)选项部分
其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节。
五、TCP连接(三次握手)
当客户机想要和服务器建立起连接。
第一步:客户机会发生一个建立连接的请求报文,这个报文中会包含报文的序号(seq=x)和同步为(请求建立连接关系:SYN=1 ACK=0 ),之后客户机处于“同步已发送”的状态
第二步:当服务器接收到讯息后,会生成一个回复报文。报文内容包括:1.随机生成的报文的序号(seq=y)2.Ack确认号,Ack=x+1(表示收到了之前的连接请求),3.控制位 SYN=1 ACK=1(表示确认请求),请求建立连接,服务器同意连接,之后处于“同步已接收状态”
第三步:收到服务端的同意建立连接的报文后,客户端会发送一个应答报文,包含序列号Seq=x+1的报文,同时发送一个确认号Ack=y+1(表示收到了之前的数据,希望下次发送的数据从y+1开始),最后将控制号ACK=1(表示应答报文)的封装进去。之后客户端处于“连接已建立”的状态。服务器收到客户端的应答报文后,也进入“连接已建立”的状态。
六、TCP的四次挥手
TCP四次挥手过程
1.第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入fin_wait_1状态
2.第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接受
3.第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态
4.第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手
七、UDP协议
传输层另一个重要的协议就是用户数据报协议 UDP。UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。
1)UDP的主要特点是:
(1)UDP 是无连接的。
即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP 使用尽最大努力交付。
即不保证可靠交付,因此主机不需要维护复杂的连接状态表(这里面有许多参数)。
(3)UDP 是面向报文的。
发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不分拆,而是保留这些报文的边界。这就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文,如图 5-4 所示。在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片处理,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
(4)UDP 没有拥塞控制。
因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如:IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络出现拥塞时丢失一部分数据,但却不允许数据有太大的时延。UDP 协议正好适合这种要求。
(5)UDP 支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
2)UDP首部格式
用户数据报 UDP 有两个部分组成:首部 + 数据部分。首部部分很简单,只有 8 个字节(如图 5-5),由四个字段组成,每个字段的长度都是两个字节。各字段含义如下:
(1)源端口:源端口号。在需要对方回信时选用。不需要使用时可用 0 填充。
(2)目的端口:目的端口号。这在终点交付报文时必须使用。
(3)长度:UDP 用户数据报的长度,其最小值是 8(即仅有首部部分),单位:字节。
(4)校验和:检测 UDP 用户数据报在传输过程中是否出错。有错就丢弃。
八、Telent协议
Telnet是一个简单的远程终端协议,也是互联网的正式标准。用户用Telnet就可在其所在地通过TCP连接注册(即登录)到远地的另一个主机上(使用主机名或IP地址)。
Telnet能将用户的击键传到远地主机,同时也能将远地主机的输出通过TCP连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上。
操作如下
九、总结
传输层协议中,TCP/IP协议是重中之重。在此协议中的网络分层不同于OSI的七层,而是五层或四层。
tcp数据段分为来源连接端口(16位长)、目的连接端口(16位长)、序列号(seq,32位长)、确认号(ack,32位长)、数据偏移(4位长)、保留(3比特长)、标志符(9比特长)、窗口(WIN,16位长)、校验和(Checksum,16位长)、紧急指针(16位长、选项字段—最多40字节。
以及最为重要的TCP三次握手,第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。