一、TCP
TCP是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要先和目标主机建立连接。然后,在此连接上,被编号的数据段按序收发。同时,要求对每个数据段进行确认,保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。

- 源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。
端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。
- 顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
- 确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
- 头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
- 标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
- URG:紧急指针(urgent pointer)有效。
- ACK:确认序号有效。
- PSH:接收方应该尽快将这个报文段交给应用层。
- RST:重建连接。
- SYN:发起一个连接。
- FIN:释放一个连接。
- 窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
- TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
- 紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
- 选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
三次握手与四次挥手
三次握手:

(1)客户端发送 SYN(SEQ=x)报文给服务器端,进入 SYN_SEND 状态。
(首部的同步位SYN=1,初始序号seq=x)
(2)服务器端收到 SYN 报文,回应一个 SYN (SEQ=y)ACK(ACK=x+1)报文,进入 SYN_RECV 状态。
(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y)
(3)客户端收到服务器端的 SYN 报文,回应一个 ACK(ACK=y+1)报文,进入 Established 状态。
(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1)
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
四次挥手:

(1)某个应用进程首先调用 close,称该端执行“主动关闭”(active close)。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕。
(FIN=1,序号seq=u)
(2)接收到这个 FIN 的对端执行 “被动关闭”(passive close),这个 FIN 由 TCP 确认。
(ACK=1,序号seq=v,确认号ack=u+1)
(3)服务器如果有数据要继续发送,则发送。若果没有要向客户端发出的数据,服务器发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务器进入LAST-ACK(最后确认)状态,等待客户端的确认。
(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)
(4)接收这个最终FIN的原发送端 TCP(即执行主动关闭的那一端)确认这个 FIN。
既然每个方向都需要一个 FIN 和一个 ACK,因此通常需要4个分节。
(ACK=1,seq=u+1,ack=w+1)
二、UDP
UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。

三、Socket
有时,我们把一个IP地址和一个端口号合称为一个套接字(Socket)
备注:
(1)TCP与UDP的区别
TCP: TCP是面向连接的, 可靠的流协议.
流就是指不间断的数据结构(你可以把它想象成排水管中的水流)。当应用程序采用TCP发送消息时, 虽然可以保证发送的顺序, 但还是犹如没有任何间隔的数据流发送给接受端.
TCP为提供可靠性传输, 实行顺序控制或重发控制机制. 此外还具有流控制(流量控制),拥塞控制,提高网络利用率等众多功能.
UDP: 它是不具有可靠性的数据报协议. 细微的处理它会交给上层应用去完成.
在UDP的情况下, 虽然可以确保发送消息的大小, 却不能保证消息一定会到达, 因此,应用有时会根据自己的需要进行重发处理.
UDP主要用于那些对高速传输和实时性有较高要求的通信和广播通信. 我们举个通过IP电话进行通话的例子. 如果使用TCP, 数据在传输途中如果丢失会被重发, 但这样无法流程地传输通话人是声音, 会导致无法进行正常交流. 而采用UDP, 它会不进行重发处理. 从而也就不会有声音大幅度延迟到达的问题. 即使有部分数据丢失, 也只是会影响某一小部分通话

小结TCP与UDP的区别:
1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。
(2)TCP与UDP应用场景:
TCP 是可靠的但传输速度慢 ,UDP 是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。
若通信数据完整性需让位与通信实时性,则应该选用 TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)。
(3)为什么要三次握手,可以二次握手吗?
主要为了防止已失效的连接请求报文段突然又传送到了服务器,因而产生错误。不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端不理睬服务器的确认且不发送数据,则服务器一致等待客户端发送数据,浪费资源。
(4)客户端在TIME-WAIT状态必须等待2MSL的时间?
1.保证客户端发送的最后一个ACK报文段能够到达服务器。
2.防止“已失效的连接请求报文段”出现在本连接中。
1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的服务器收不到对已发送的FIN+ACK报文段的确认,服务器超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务器都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务器重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务器无法正常进入到CLOSED状态。
2)客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
(5)为什么连接的时候是三次握手,关闭的时候确实却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
更多内容:
TCP/IP篇(2)--协议网络互联层-IP协议
本文详细解读TCP的三次握手与四次挥手过程,比较TCP与UDP的可靠性和效率,以及它们在不同场景的应用。了解两者在连接建立与关闭中的机制,以及如何根据业务需求选择合适协议。

被折叠的 条评论
为什么被折叠?



