서버 프로그래밍

TCP & UDP Note #1

하늘흐늘 2009. 5. 12. 17:34
반응형

From Chapter 6 내부구조, TCP/IP The Pocket Guide to TCP/IP Sockets C, MSDN,
NetworkProgramming For Microsoft Windows



Socket
소켓구조체
1) 내부의 소켓구조와 링크된 일종의 핸들(Handle)
2) 지역 및 원격 인터넷 주소와 포트, SendQueue, RecvQueue, TCP연결관련상태정보


TCP
1. Defensive Programming
   1) Deadlock
       n bytes를 send(...)할 때, n=source SendQ size + destination RecvQ size + remained size
       n>source SendQ size + destination RecvQ size 클 경우
       보낸 호스트는 send(...)함수 내에서 받는 호스트가
       recv(...) size>source SendQ size + reamined size가 될 때까지 기다린다.
       이런 현상이 있어나는 것은 send(...)로 SendQ size + RecvQ size 이상의 데이터가 보낼 떄
       일어나며 양쪽 호스트에서 동시에 SendQ size + RecvQ size이상의 데이터를 보내게 되면
       데드락이 발생한다.

2. Socket Options
    1) SO_SNDBUF
        send(..)시 보내는 데이터 size n이 SendQ size보다 클경우 Buffer in send(...)-> Socket SendQ-> TCP Send의 복사가 
        여러번 일어나며 복사가 일어나는 동안 Context Switching이 OS를 통하여 일어날 수 있어 오버헤드의 원인이 될 수 있다.
        큰 패킷을 보내는 경우 SendQ size를 크게 잡는 것을 생각해보아야 한다.
    2) SO_RCVBUF
        recv(..)시 최대로 받을 수 있는 데이터양을 조절할 수 있다.
    3) SO_SNDBUF, SO_RCVBUF
        일반적으로 허용하는 최대값은 디폴트 값보다 크다.

3. Programming
    1) Special Keywords
        - INADDR_ANY : 서버가 가지고 있는 모든 주소를 다 사용한다.



UDP
1. APIs
   1) recvfrom(...)
       1. 반환될 수 있는 최대 데이터량: UDP 최대 페이로드(payload): 65,507 bytes
       2. 지정된 크기 n이 버퍼내의 패킷사이즈보다 작을 시 지정된 크기 n만큼만 반환되며
           버퍼내 패킷은 유실됨
       3. 버퍼부족시 Tip
          -MSG_PEEK와 작은 버퍼로 UDP버퍼의 패킷의 앞부분을 읽어 메시지 크기를 결정
          (패킷자체가 사이즈를 지원해야함)
   
    2) sendto(...)
       1. taken not to exceed the maximum packet size of the underlying subnets
       2. 최대 메시지 크기는 getsockopt(SO_MAX_MSG_SIZE)를 이용하여 얻을 수 있다.
       3. 하위 프로토콜에서 데이터를 보낼 수 없을 때 WSAEMSGSIZE 에러가 난다.

반응형