网络编程之高阶TCP

TCP用户代码

         网络编程之socket--TCP/IP

        TCP是面向字节流的,即消息的描述必须由应用程序来完成,且要在消息结束的时候显示通知TCP模块以迫使其立即发送相应的字节数据。

        简单的说,TCP的recv的字节数可以是任意的,只要对方发送,不是按send的次数来recv的,是按发送的字节数来recv。即,发送方可以调用10次send,每次发送5个字节,而接收方可以调用一次recv,一次性接收50字节数据,也可以调用50次recv,一次接收一个字节数据。

        而UDP的sendto与recvfrom的次数是相对应的,调用一次sendto就是一次数据报,这个数据包只能recvfrom一次,不能分开接收(即调用多次recvfrom来接收一次sendto数据),UDP的数据包是有边界的,所以即使使用MSG_PEEK也不可能recvfrom部分数据。

        //服务器端典型代码
	//1.socket(...,SOCK_STREAM,0)
	//2.bind(...,&ServerAddress,...)
	//3.listen(...,...)
	//4.accept(...,&ClientAddress, ...)
	//5.recv(..., &ClientAddress, ...)
        //客户端典型代码
	//1.socket(...,SOCK_STREAM,0)
	//2.bind(...,&ClientAddress, ...)
	//3.connect()
	//4.send(..., &ServerAddress, ...)

TCP数据报文格式

       传输控制协议(TCP)提供了可靠的报文流传输和对上层应用的连接服务,TCP使用顺序的应答,能够按需量重传报文。若不计任选字段,通常为20字节。

    每个TCP段都包含源端口和目的端口的端口号,用于寻找发送端和接收端的应用进程。这2个值加上IP首部的源端IP地址和目的IP地址唯一确定一个TCP连接。

    序号用来标识从TCP发送端想向TCP接收端发送的数据字节流,表示在这个报文段的第几个数据字节。若将字节流看作两应用程序的单向流动,则TCP用序号对每个字节进行计数。序号是32b的无符号数字,范围0-2^32-1。

    当建立一个新的连接时,SYN标志变为1.序号字段包含由这个主机选择的该连接的初始序号ISN。该主机要发送数据的第一个字节序号为这个ISN加1,因为FIN标志消耗了一个序号。

    确认序号是上次已成功收到数据字节序号加1。只有ACK标志位1时确认序号字段才有效。

    TCP为应用层提供了全双工服务,数据可以在两个方向上独立地进行传输。因此,连接每一端必须保持每个方向上的传输数据序号。

    TCP流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小为16b,窗口大小最大为65535字节。

    检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。

    只有URG为1时,紧急指针才有效,为一个正的偏移量。

猜你喜欢

转载自blog.csdn.net/qq_33408113/article/details/80135677