参考推荐:
TCP/IP 详解卷一 - TCP_思翊的博客-CSDN博客
TCP协议和UDP协议_udp协议和tcp协议_仟各的博客-CSDN博客
TCP的MSS的计算与详解_tcp mss_林哥小站的博客-CSDN博客
目录
TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP协议在UDP基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP数据包和UDP一样,都是由首部和数据两部分组成,唯一不同的是,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。
TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
1、TCP段首部格式?
TCP段首部的定长部分为20个字节,即5个单位的长度。
- 源端口:16位,作用是标识报文的返回地址。
- 目的端口:16位,指明报文接收计算机上的应用程序地址接口。
- 序号:32位,指出段中的数据部分在发送方数据流中的位置。
- 确认号:32位,指出接收方希望收到对方下次发送的数据的第一个字节的序号
- 首部长度(数据偏移):4位,包括TCP头大小,指示何处数据开始。
- 保留:6位,这些位必须是0。为了将来定义新的用途而保留。
- CWR:压缩标志,CWR与后面的 ECE 标志都用于 IP 首部的 ECN 字段,当ECE = 1 时,则通知对方已将拥塞窗口缩小。
- ECE:拥塞标志,当ECE= 1 则会通知对方,从对方到这边的网络有阻塞。
- URG位:紧急标志,和紧急指针配合使用,当其为1时表示,此报文要尽快传送。
- ACK位:确认标志,和确认号字段配合使用,当ACK位置为1时,确认号字段有效。
- PSH位:为推送标志,置1时,发送方将立即发送缓冲区的数据。
- RST位:复位标志,置1时,表明有严重差错,必须释放连接。
- SYN位:同步标志,置1时,表示请求建立连接。
- FIN位:终止标志,置1时,表明数据已经发送完,请求释放连接。
- 窗口大小:16位,用于向对方通告当前本机的接收缓冲区的大小。
- 校验和:16位,校验范围包括段首部、数据以及伪首部。
- 紧急指针:16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
- 选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域为0。
- 数据:该TCP协议包负载的数据。
2、TCP连接的建立过程?三次握手?
1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=X,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=X+1,随机产生一个值seq=Y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
3)第三次握手:Client收到确认后,检查ack是否为X+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=Y+1,并将该数据包发送给Server,Server检查ack是否为Y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
3、TCP连接的关闭过程?四次挥手?
建立连接的过程是三方握手,而关闭连接通常需要4个段(四次握手),服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。
1)Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4)Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
4、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
- 保证TCP协议的全双工连接能够可靠关闭;
- 保证这次连接的重复数据段从网络中消失。
5、SYN攻击
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态并且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令查看:
#netstat -nap | grep SYN_RECV
6、TCP协议特点
- TCP是面向连接的运输层协议;
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的;
- TCP提供可靠交付的服务;
- TCP提供全双工通信:数据在两个方向上独立的进行传输,因此,连接的每一端必须保持每个方向上的传输数据序号;
- 面向字节流:面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。
UDP协议
UDP(User Datagram Protocol,用户数据报协议)定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP协议比较简单,实现容易;但UDP协议没有确认机制,不面向连接,也不保证传输的可靠性,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。
1、UDP首部格式
- UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,
源端口号:16位,需要对方回信时选用,不需要时全部置0;
目的端口号:16位,在终点交付报文的时候需要用到;
长度:16位,UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部);
校验和:16位,检测UDP数据报在传输中是否有错,有错则丢弃,该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。
当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。
2、UDP校验和
在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。
伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
UDP伪首部结构和TCP的伪首部相同,只不过UDP伪首部的协议字段值为17,而TCP为6,下图为UDP用户数据报的格式和伪首部:
UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。
发送方,首先是把全零放入校验和字段并且添加伪首部,然后把UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送),接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段。在接收方,把收到得UDP数据报加上伪首部(如果不为偶数个字节,还需要补上全零字节)后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1,。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。
3、UDP协议特点
UDP主要特点如下:
- UDP是无连接的:发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
- UDP 尽最大努力交付:不保证可靠交付,因此主机不需要维护复杂的连接状态表。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。
- UDP是面向报文的:发送方的 UDP对应用层交下来的报文,添加首部后直接向下交付为IP层,既不合并,也不拆分,保留这些报文的边界。
- UDP没有拥塞控制:应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用(如:IP电话、实时视频会议等)要求以稳定的速度发送,在网络出现拥塞时能容忍一些数据的丢失,但是不能允许有较大的时延(比如实时视频,直播等)
- 分组首部开销小,TCP首部20字节,UDP首部8字节。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP大小受限:UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含了UDP的首部)。也就是说UDP无法直接表示一个比较大的数据报。
端口号
数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。
端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
通过IP地址可以确定一台主机,但是这个主机上运行同时运行着很多的程序,比如 qq、浏览器。当这个主机收到一个具体的数据的时候,那么它怎么知道要把这个数据交给哪个程序来处理?就是通过端口号来区分。
每个访问网络的进程都需要有一个不同的端口号,比如MySQL默认的端口号 3306。端口号是一个整数(2个字节,一共16比特位,取值范围0~65535)。
一台主机上,不能有两个进程尝试关联(绑定)同一个端口号。如果第一个进程绑定了端口号 1102,第二个进程也尝试绑定这个端口号 1102的时候,就会失败。
源端口号:发送方的端口号;
目的端口号:接收方的端口号。
详细端口号可搜索:常见端口号。
注:
如有错误、侵权,请联系作者更改删除!