TCP/IP协议簇的传输层协议:
TCP和UDP
TCP(Transmission Control Protocol):传输控制协议
面向连接的,可靠的进程到进程通信的协议。TCP提供全双工服务,即数据可在同一时间双向传输,每个TCP都有发送缓存和接受缓存,用来临时存储数据。(通信双方之间在进行通信之前要先建立连接,例如打电话)。
TCP报文段
TCP将若干个字节构成一个分组,叫报文段(Segment)
TCP报文段封装在IP数据报中
1.源端口号:发送方进程对应的端口号。
2.目标端口号:对应的是接收端的进程的端口号。
3.序号:发送端为每个字节进行编号,便于接受端正确重组。
4.确认号:用于确认发送端的信息。这个是用来告诉发送端这个序号之前的数据段都已经收到了,如确认号是N,就表示前N-1个数据段都已收到。
5.首部长度:用它可以确定TCP首部数据结构的字节长度。一般情况下TCP首部是20字节,但首部长度最大可以扩展为60字节。
6.保留:作为扩展位,目前没有用到。
7.控制位:
URG:紧急位。紧急指针有效位。
ACK:确认位。只有当ACK=1时,确认序列号字段才有效;当ACK=0 时,确认号字段无效。
PSH:急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。
RST:重置位。当RST值为1时,通知重新建立TCP连接。
SYN:同步(连接)位。同步序号位,TCP需要建立连接时将这个值设为1。
FIN:断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1。
8.窗口大小:说明本地可接收数据段的数目。这个值的大小是可变的,当网络通畅时接收端响应消息会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的。比如下载速度从一开始的几KB逐渐提升到几MB 的过程。
9校验和:用来做差错控制。字段检验的范围包括首部和数据这两部分。数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据。
10.紧急指针:和URG配合使用,当URG=1时有效。
11.选项:在TCP首部可以有多达40字节的可选信息.例如:最大报文段长度MSS(Maximum Segment Size).MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。
UDP(User Datagram Protocaol):用户数据报协议
是无连接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。(传输数据速度更快、效率更高)
TCP的“三次握手”和“四次挥手”
这里先把PC1作为客户端,PC2作为服务端
“三次握手”
第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面SYN为标志位,Seq=x,SYN=1,当服务端收到这个报文之后就知道客户端要跟我发送一个新的连接,于是客户端就会向客户端发送一个确认消息包,这个消息包Seq=y,Ack=x+1,SYN=1,ACK=1。以上两次握手之后对于客户端而言其实是已经知道所有的信息,就是我既能给服务端发消息且还能收到服务端的消息,但是对于服务端而言两次握手是不够的,因为到目前为止服务端只知道一件事情,就是客户端发给我的消息我能知道,但是我发给客户端的消息客户端能不能收到还不知道。所以还要进行第三次握手,第三次握手就是当客户端收到服务端确认消息的报文之后,还要继续给服务端进行一个回应,Seq=x+1,Ack=y+1,ACK=1的确认消息。通过以上三次连接后,不管是客户端还是服务端都彼此知道了既能给彼此发消息也能收到对方的消息,那么这个连接就可以被安全的建立了。
四次握手
四次握手机制也是由客户端发起的,客户端会发送一个报文,在报文里面FIN/ACK位作为标志位,FIN=1,ACK=1。当服务端收到这个报文之后就知道了客户端想要和我断开连接。但是此时服务端不一定能做好准备,因为当客户端发断开连接这个消息之后对于服务端而言极有可能还有未发送完的消息,还有继续发送。所以对于服务端而言只能进行一个消息确认,就是我先告诉服务端,我知道你要和我断开连接了,但是我这里可能还有没做好准备需要等我一下,等会我会告诉你,于是发完这个消息确认包之后,可能过一会他就会继续发送一个断开连接的报文,也是一个FIN/ACK为标志位的报文,FIN=1,ACK=1.是由服务端发送给客户端的。这个报文表示了服务端已经准备好了断开报文的准备,那么当这个报文发给了客户端之后,客户端同样要给服务端继续发送一个消息确认的报文,一共有四次,通过这四次相互沟通和连接,我就知道了不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就断开了。