TCP和UDP是TCP/IP中传输层中两个最具代表性的协议,TCP提供可靠的通信传输,UDP则是常被应用于广播和细节控制(相比而言,不太可靠)
可是,TCP的可靠性表现在哪里??它的报文格式又是咋样的呢??
TCP
1. 是一种基于字节流的传输,我们称之为段(segment),发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端,字节流的无间隔行
2. 面向连接,也就是说tcp在传输之前,首先有一个建立连接的过程
3. tcp的可靠性传输,也就是说它能在逻辑上保证传输是可靠的,顺序控制(不失序),重发机制(数据丢失),端到端校验和(传输错误),拥塞控制等功能
4. 缓冲传输,就是说TCP可能不会立即发送这个段,它可能会把这些段放入缓冲区,等到一定的时机然后再发送出去
5. 全双工,发送的同时也可以接收数据(每一台联网的主机都可以发送信息,也可以接收服务端的信息),而半双工(只能发送或只能接收,例如收音机就是只能接收的)
6. 流量控制,通过窗口控制达到流量控制的目的
我们可以看到IP报文里面封装了很多的东西,有IP头部(占用20字节),TCP头部(占用20字节),接下来就是TCP数据了,同时,称TCP头部和TCP数据为IP的数据,这也就是不断封装的过程,同理当传过去之后,就有了解封的过程
TCP报文:
我们可以看到:TCP报文 = TCP头部 + 数据
TCP头部是20个字节:
1. 先是源端口号和目的端口号各占2个字节(结合IP头部的源IP地址,目的IP地址,就已经构成了简单地TCP连接)
2. 然后是序列号(这个报文段的第一个数据字节序号),确定号各占4个字节(仅当ACK为1时有效,表示期望收到的下一个字节的序号,三次握手,四次挥手中会提到)
3. 再就是头部长度,占4位(最大是15,但是单位是4字节,也就是15*4 = 60个字节),接下来就是6位的保留,必须全部为0
4. 6个标志位
URG为1是,紧急指针有效
ACK为1时, 确认号有效
PSH为1时, 接收方应尽快将这个报文段交给应用层
RST为1时, 连接重置
SYN为1时, 用来发起一个连接
FIN为1时, 表示要终止一个连接
5. 接下来窗口尺寸(起到流量控制的功能)
6. 2字节的TCP校验和(采用端对端的网际校验和,但是这个是对头部和数据都进行校验的),2字节的紧急指针(是一个正的偏移量,与序号字段中的值相加,表示紧急数据最后一个字节的序号,是发送端向另一端发送紧急数据的一中方式),还有4字节的选项(必须是4的整数倍,否则用0来填充,最常见的可选字段是MSS(Maximum Segment Size)最长报文大小,每一个连接方通常都在第一个报文中指定这个选项,它指明了所能接收的最大报文长度,值得注意的是:以太网的MTU为1500,路由器的MTU为576,,为了减少这个分片的过程,所以:20(IP头部)+20(tcp头部)+536 = 576,也就说明了默认的MSS为536(为了最大化的传输)
tcp:应用数据被分割成TCP认为最合适发送的数据块,称之为段,发送给IP层
不可靠表现在以下几个方面:传输出错,丢包,重复(粘包), 失序,
出错:会通过网际校验和进行检验(如果数据在传输的过程中校验和丢失或出错,那么TCP将直接丢弃这个报文段,并且不产生确认(导致重传))
失序:报文头部会有一个序号,来保证传输的正常进行
重复:(基于字节流的传输,无边界,不能严格意义上的断开,说是一个字节一个字节的传,所以发送给目的端的时候,它接受的有时是不止一个流,可能一个,可能两个,我们不知道的,所以)也通过序号来保证不重复
丢包:超时重传机制 + 确认机制(一定时间内没有收到确认的消息就会启动重传,当TCP发出一个段之后,会启动一个定时器,等待目的端确认收到这个报文段,通常这个确认不是立即发送,而是推迟几分之一,如果源端不能收到确认,启动重传机制)