Stream Socket借助TCP(The Transmission Control Protocol)实现重发和排序,确保数据完整性,而Datagram Socket则不检查包的达和顺序,但如果一个包到达,则这个包的内容是完整的,不会出现到半个包的情况。
TCP 會在傳輸層對將上層送來的過大訊息分割成多個分段(TCP segments),而 UDP 本身不會,UDP 是訊息導向的(message oriented),若 UDP 訊息過大時(整體封包長度超過 MTU),則會由 host 或 router 在 IP 層對封包進行分割,將一個 IP packet 分割成多個 IP fragments。IP fragmention 的缺點是,接收端的系統需要做 IP 封包的重組,將多個 fragments 重組合併為原本的 IP 封包,同時也會增加封包遺失的機率。如將一個 IP packet 分裂成多個 IP fragments,只要其中一個 IP fragment 遺失了,接收端就會無法順利重組 IP 封包,因而造成封包的遺失,若是高可靠度的應用,則上層協定需重送整個 packet 的資料。UDP, User Datagram Protocol就意味着将transimission control交给用户自行处理。
Internet socket
Stream Socket借助TCP(The Transmission Control Protocol)实现重发和排序,确保数据完整性,而Datagram Socket则不检查包的达和顺序,但如果一个包到达,则这个包的内容是完整的,不会出现到半个包的情况。
IPv4 and IPv6
IPv4的addr对应sockaddr_in (16 bytes):
IPv6的addr对应sockaddr_in6 (28 bytes)
IPv4和IPv6的前4字节的布局是一样的,如果字节不敏感,完全可以用IPv6的28字节布局来做IPv4,这样可以兼容IPv4, IPv6地址,通过不同类型指针去指向即可。
IP address 操作
仅 IPv4 (过弃)
兼容 IPv6 (推荐)
System Calls or Bust
getaddrinfo() - prepare to launch!
getaddrinfo帮助我们快速得到sockaddr,支持DNS解析和IPv6的支持,取代之前的gethostbyname。
如果你需要开启一个server, 那么对应的调用如下:
如果你是client,则对应的代码如下:
socket()
然后,应该在getaddrinfo的基础上,call socket:
bind()
参考文档