1、开发流程图
2、socket 中 TCP 的三次握手建设连贯详解
咱们晓得 tcp 建设连贯要进行“三次握手”,即替换三个分组。大抵流程如下:
客户端向服务器发送一个 SYN J
服务器向客户端响应一个 SYN K,并对 SYN J 进行确认 ACK J+1
客户端再想服务器发一个确认 ACK K+1
只有就完了三次握手,然而这个三次握手产生在 socket 的那几个函数中呢?请看下图:
image
图 1、socket 中发送的 TCP 三次握手
从图中能够看出,当客户端调用 connect 时,触发了连贯申请,向服务器发送了 SYN J 包,这时 connect 进入阻塞状态;服务器监听到连贯申请,即收到 SYN J 包,调用 accept 函数接管申请向客户端发送 SYN K,ACK J+1,这时 accept 进入阻塞状态;客户端收到服务器的 SYN K,ACK J+ 1 之后,这时 connect 返回,并对 SYN K 进行确认;服务器收到 ACK K+ 1 时,accept 返回,至此三次握手结束,连贯建设。
3、网络字节序与主机字节序
主机字节序就是咱们平时说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保留的程序,这个叫做主机序。援用规范的 Big-Endian 和 Little-Endian 的定义如下:
a) Little-Endian 就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian 就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
网络字节序:4 个字节的 32 bit 值以上面的秩序传输:首先是 0~7bit,其次 8~15bit,而后 16~23bit,最初是 24~31bit。这种传输秩序称作大端字节序。因为 TCP/IP 首部中所有的二进制整数在网络中传输时都要求以这种秩序,因而它又称作网络字节序。字节序,顾名思义字节的程序,就是大于一个字节类型的数据在内存中的寄存程序,一个字节的数据没有程序的问题了。
所以:在将一个地址绑定到 socket 的时候,请先将主机字节序转换成为网络字节序,而不要假设主机字节序跟网络字节序一样应用的是 Big-Endian。因为这个问题曾引发过血案!公司我的项目代码中因为存在这个问题,导致了很多莫名其妙的问题,所以请谨记对主机字节序不要做任何假设,务必将其转化为网络字节序再赋给 socket。