tcp :
绑定一个 socket 只是用来监听,accept 对每个客户端生成一个 socket 用来维护滑动窗口等。每个客户端用一个 socket 用来维护滑动窗口等。
4 次挥手对应两次 close 的 fin 和返回的 ack。
而三次挥手在 connect 里阻塞完成。
udp :
双方各建一个 socket,收到对方信息时,也收到对方 ip,后面用自己的 socket 往 ip 发送就行。
通用:read write 系统io读写,可以读写任何文件fd #include<unistd.h>
tcp:recv send #include<sys/socket.h>
udp:recvfrom sendto #include<sys/socket.h>
udp的recvfrom接收到数据后要即使从缓冲区拿出数据,不然缓冲区满了,会覆盖之前的数据。
sendto发送时不存在发送部分字节,因为它时数据报形式,会把用户的数据全部装入一个udp数据报一起发送,要么成功要么失败。无论每次发送多少,每个 sendto 调用会尝试将整个数据报作为一个不可分割的单元发送,具有原子性,所以只有成功和失败。若无法发送(如缓冲区不足、报文过大,没有网络等),sendto 返回 -1。因此加上包头尽量不超过1个MTU大小,大部分以太网MTU为1500字节。
tcp的发送是流式的它有滑动窗口,它的send每次调用只负责将数据拷贝到内核。它的返回是拷贝到内核的字节大小。因此如果一次没有发送完成,需要用户手动调整待发送缓冲区的指针位置,直到发送完毕。(多次send拷贝到内核后,可能只对应着一次网络发送,因此控制发送大小的是滑动窗口。)
tcp的接收,因为tcp是流式的,它有滑动窗口限制,当缓冲区快满时,会通知阻止发送方的发送行为,因此不会出现覆盖数据,介个就叫可靠传输阿。
无论时udp还是tcp,他们的接收默认都是阻塞的,但可设置非阻塞。