TCP和UDP区别如下:
①服务器端 (被动接受连接的角色)
创建一个用于监听的套接字
将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)
设置监听,监听的fd开始工作
阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)
通信
6.通信结束,断开连接
②客户端(主动连接角色)
TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如IP地址、端口号等。
TCP可以看成是一种字节流,它会处理IP层或以下层的丢包、重复及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用四次挥手关闭一个连接。
三次握手目的是保证双方互相之间建立了连接。
三次握手发生在客户端连接的时候,当叼用connect()的时候,底层会通过TCP协议进行三次握手。
TCP传送的数据单元称为报文段。TCP报文段既可以用来 运载数据,又可以用来建立连接、释放连接和应答。TCP报文段分为TCP头部和数据两个部分。
TCP头部需要掌握以下几种信息:
32位序号(seq):由于TCP连接传送的数据是面向字节流的(逐个字节传送的),所以为了保证传送数据的完整性和顺序性,TCP连接传送的每个字节都按顺序编号。序号字段的值指的是本报文段传送的数据的第一个数据字节的序号。 如:一个报文段所发送的数据的序号值是301,携带的数据有100B,那么本报文段数据的最后一个字节序号是400,因此下一个报文段发送的数据的序号应该从401开始。
32位确认号(ack):期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,表明到序号N-1为止的数据都已经正确收到,并且期望收到序号为N的报文段序号。
ACK:表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段。建立连接后所有发送的报文ACK都置为1.
SYN:表示请求建立连接。我们称携带SYN标志的TCP报文段成为复位报文段。:
FIN:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段称为结束报文段。
16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓存中还能容纳多少个字节的数据,这样对方可以控制发送数据的速度。
三次握手过程如下:
简易理解版本的三次握手过程图如下:(省略序号和确认号)。
完整版三次握手的过程时序图如下:
例如:客户端给服务器端发送数据的过程如下图
因为客户端要确认自己是否能发送和接收数据,服务端也要确认自己能否发送和接收数据。如果客户端只能发送数据不能接收数据,采用两次握手的话,流程如下:
客户端只能发送数据不能接收数据,但2次握手便建立了连接,这种建立的连接显然是不可靠的。而三次握手可以确认客户端和服务器端收、发数据都正常才建立可靠的连接。
四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。
客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。
因为TCP连接的时候,采用三次握手建立的连接是双向的,在断开的时候需要双向断开。
简单理解版本四次挥手图如下:
例如:客户端请求断开连接(服务器端也可以请求断开连接,过程一样)。
完整版四次挥手的过程时序图如下:
因为建立连接的时候通信双方会保存各自的信息(ip、端口等),断开连接后应该把这些信息销毁掉,否则这些信息一直存在系统当中,会造成内存泄漏问题。
流量控制:控制发送方发送速度太快,超出接收方缓冲区的大小。
拥塞控制:使用网络带宽主机太多,导致整个网络发送缓慢、排队时间过长而出现拥塞。
滑动窗口是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况,直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接受任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。
TCP中采用滑动窗口机制来进行传输控制,,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。 发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报。
滑动窗口是TCP中实现诸如ACK确认、流量控制、拥塞控制的承载结构。
滑动窗口可以理解为一块缓冲区,窗口理解为缓冲区的大小。
滑动窗口的大小会随着发送数据和接收数据而变化。通信双方都有发送缓冲区和接收数据的缓冲区。
每一时刻,接收方给发送方发送的TCP报文段中的信息会包含接收方剩余缓冲区的大小,每次发送方发送数据的大小不能超过剩余缓冲区的大小,如果剩余缓冲区为0,则发送方停止发送数据。
例:发送端发送速度比接收端接收速度快,利用滑动窗口来进行流量控制的过程如下图:
资料:https://www.nowcoder.com/study/live/504/4/17