Posix网络部分API综述
- 客户端:socket、bind(可以不绑定)、connect、send、recv、close
- 服务端:socket、bind、listen、accept、recv、send、recv、close
- 所有的语言进行网络通信,只要是基于linux底层都会去调用这道api。
TCP协议栈通信过程
TCP三次握手和四次挥手(看下图)

- 参数解释:
- seq:TCP头里的sequence,代表发送的TCP包的序列号。
- ack:TCP头里的acknum,代表对上次接收到的TCP包的应答,通常是上次接收包的seq号+1。
- SYN和ACK代表标志位。
- syn和ack主要是实现了三个目的:
- 防止数据丢失,当我们发送出去的syn很久没有得到ack应答时,就会进行重传等操作。
- 防止数据重复,可能对方因为某些原因对一个请求发了很多次应答,可以依据这两个参数去防止数据重复接收。
- 防止数据乱序,这个很好理解就是根据seq和ack确保数据接收正确,因为网络包在网络上的传输速率不同,可能先发的包后面到。
- 另外三次握手建立连接时,双方的第一个seq值是随机的。
三次握手
- 首先由通信双方的某一方(后面就用client了,其实server和client都是可以的)发起连接请求,即发送一个带SYN标志位的TCP数据包给server端。
- server端收到数据包后,除了SYN位以外,还会增加一个ACK确认位,然后发送给clinet端。
- client端收到数据包后,给server端回复一个带ACK确认位的数据包给服务端,到此,通信双方就算建立连接了。
常见问题?
为什么是三次握手而不是两次?
- 因为TCP连接是安全可靠的,三次握手的话会保证双方都能接受到对方的数据,第一次服务端收到客户端消息后可以确定客户端发送数据没问题,然后第二次服务端发送给客户端消息,客户端可以确定服务端的收发都没有问题,但是服务端不知道客户端接收是否成功,所以,客户端还需要发一个数据包告诉服务端,它的接收也没有问题,因此,这里是三次连接而不是两次。
三次握手和哪些函数有关?