UDP와 TCP
- Created
- 2022년 9월 3일 PM 8:15
Transfort 계층의 가장 기본적인 목적은? Process to Process logical communication
- 해당 기능을 제공하기 위해서 transfort 계층에서 제공하는 가장 기본적인 기능은 Multiplexing/De-Multiplexing
- 보내는 측에서는 여러 소켓에서 오는 메세지를 받아야하고
- 받는 측에서는 네트워크를 통해서 오는 메세지를 목적시 소켓으로 배달해줘야함
Connection-oriented demux (커넥션 지향 디멀티플렉싱)#

Connection-oriented는 서버에 여러 어플리케이션들이 있음
- 각 애플리케이션들은 도어소켓을 열고있고, 클라이언트가 접속하면 별도의 소켓을 열어서 소통
- Receiver에서 demux를 하기 위해 4가지 정보가 다 필요함
- source IP address
- source port number (특정 클라이언트를 위한 포트)
- dest IP address
- dest port number (도어소켓 포트번호)
- 서버쪽 어플리케이션은 자식 proccess를 fork해서 해당 포트만을 담당하도록 함
- 혹은 threaded server를 통해서 이용할 수 도 있음
UPD: User Datagram Protocol#
- connectionless한 transfort
- no handshaking
- 각 UDP 세그먼트를 독립적으로 주고받음
- 네트워크계층에서 post delivery 이외의 추가적 기능을 제공하지 않음
- best effort 서비스를 제공함
- best effort = 증권사가 팔 수 있는 한도(매도한도)까지 증권발행을 하는 형식. (출처: 네이버 백과사전)
- 네트워크가 중간에 데이터가 소실되어도 UPD는 파악이 안되고 알려주지도 않음
- 최선의 서비스를 제공
- UDP를 이용하는 어플리케이션
- 멀티미디어 스트리밍 어플리케이션 (유실에 관대함, 지연에 예민함)
- DNS
- SNMP (네트워크 관리 프로토콜)
- 네트워트 토폴로지 같이 그룹에 묶인 여러 장치들이 중앙의 장치에게 정기적으로 자신의 상태를 REPORT함
- reliable transfer over UDP = 신뢰성 있게 UDP 보내기
- 아이러니 하게도 데이터의 무결성이 매우 중요한 어플리케이션의 경우 UDP를 이용하는 경우가 있음
- 어플리케이션 스스로가 신뢰도를 체크하기 위해서
- 에러가 발생했을때 리커버 할수있는 방법을 가지고있기 때문에
UDP: segment header#

UDP의 장점은 아래와 같음
- 커넥션이 없기 때문에 오버헤드가 적음
- 단순함 = sender나 receiver에 대한 커넥션 정보가 없음
- UDP 세그먼트의 헤더 사이즈가 작음
- UDP는 멀티플렉싱/디멀티플렉싱만 하기때문에 그 정보만 있으면 됨
- 혼잡도를 컨트롤하지 않음 = 때문에 어플리케이션이 생성하는 속도로 데이터를 내보낼 수 있게됨
UDP checksum#

- Sending UDP는 헤더를 포함한 세그먼트를 16bit integer 의 연속으로 인지함 ⇒ 이걸 다 더함
- 이걸 checksum 필드에 넣어주게 됨
- Recevier 측도 동일한 방법으로 더함 그게 Sender측 checksum과 일치하는지 확인함
- 일치하면 데이터에 문제가 생기지 않았다고 가정할 수 있음
- 일치하지 않으면? 오는동안 데이터 변형이 발생됨
- 아예 다르면 슬그머니 드랍함
- 아주 단순한 방식의 checksum 방식이기 때문에 모든 에러를 검출할 수는 없음
principles of reliable data transfer#
- Checksum
- Recevier가 세그먼트를 받았을 때 오류를 판단할 수 있어야 한다
- Acknowledgement
- 일반적으로 Sender에게 패킷을 잘 받았다는것을 알려주기 위함
- 해당 응답은 individual 혹은 cumulative일 수도 있음
- Negative acknowledgement
- Sender에게 어떤 패킷이 잘못됬다 라는것을 알려주기 위함
- 통하지 않을 수도 있음 = Recevier가 일단 패킷을 받는 경우엔 동작하지만 drop될 경우 받을 수 없음
- Timer
- Sender측에서 데이터를 보냈는데 Ack/Nack이 오지 않을 경우 네트워크에서 drop되었다 생각하고 재전송을 함
- 근데 불필요한 재전송이 발생할 수도 있음 = Recevier는 잘 받고 Ack/Nack을 보냈는데도 응답이 없어질 수도 있음
- Sequence number
- 타이머가 보낸걸 또 보낼수도 있기 때문에 시퀀스 넘버가 필요함
- Window, pipelining
- 센더와 리시버 사이의 파이프가 있다고 가정 다만 한개의 파이프 라인을 통해서 패킷을 주고받을 경우에 하나를 보내고 하나를 받고 하면 파이프에 하나의 패킷만이 왔다갔다함
- 파이프의 효율성을 높이기 위한 작업이 파이프라이닝
- Ack을 받지않은 상태에서 집어넣을 수 있는 최대 데이터량을 윈도우라 함
Connection-oriented transport: TCP#
Reliable, in-order byte stream#
- TCP는 자신이 전송하는 데이터를 byte stream으로 봄
- TCP는 일단 어플레이션에서 내려오는 데이터를 자신의 버퍼에 담음
- 해당 버퍼에서 데이터를 뽑을때 순서/혼잡도에 맞게 데이터를 뽑아옴
- 유저의 메세지 바운더리는 인식하지 않고 바이트의 연속으로 인식함
Point to Point transfer#
Sender와 Receiver가 각각 하나씩 존재
- 단 멀티캐스팅의 경우 Recevier가 여럿일 수 있음
Full duplex data#
TCP 커넥션 클라이언트 프로세스와 서버프로세스를 위해 TCP커넥션을 맺으면 동일한 커넥션을 통해서 양방향 통신이 가능
Pipelined#
TCP는 파이프의 효율을 높히고 작업량을 높히기 위해 윈도우를 설정 함
TCP Segment structure#

- UPD와 마찬가지로 크게 헤더와 페이로드로 나누어짐
- header에서 options를 제외한 나머지 헤더는 모두 고정
- TCP의 총 헤더 길이는 가변적임!
- 때문에 header length 필드가 필요함
- 고정헤더의 길이는 20byte 크기를 가짐 (32 bit * 5 line)
- process to precess 를 제공하기 위한 source/dest port를 가짐
- receive window는 flow control을 위한 필드임
- 리시버가 받을 수 있는 버퍼사이즈임
- U, A, P, R, S, F = 6개의 flag 비트
- A(Acknowledgement와 연관된 필드) = Acknowledgement에 너에대한 정보가 포함되었다는 의미
- connection estab
- R(커넥션 리셋)
- S(커넥션을 맺자는 요청을 보낼때)
- F(커넥션을 끝낼때)
- U, P ⇒ 두 플레그는 실제로는 활용되지 않고 잇음
- P : Push data now
- 데이터를 내려보내며 소켓 인터페이스에게 해당 데이터를 푸시해달라고 요청이 가능하게 하는 필드
⇒ 그러면 모든 버퍼에 있는 데이터와 지금온 데이터 모두를 즉시 내보내야 한다.
⇒ 해당 필드가 활성화 되어오면 리시버는 자신의 모든 버퍼를 플러쉬함
- U : Urgent data
- 소켓 인터페이스에 Urgent 한 데이터라는걸 표시해주는 플래그
- P와 마찬가지로 모든 버퍼를 쏴버림
- Urgent data pointer 필드에 Urgent한 데이터가 어디있는지 표시해서 보내줌
TCP seq, numbers, ACKs#


- sequence numbers
- 세그먼트 페이로드에 실려있는 첫번째 바이트의 번호
- acknowledgements
- 누적 ACK을 사용함
- 다음에 받을 seq를 기대한다!는 의미
TCP round trip time, timeout#

Timer는 RTT와 관련이 깊음
- RTT를 너무 짧게 잡으면? ACK이 오는 중임에도 불구하고 데이터를 다시 보냄
- RTT를 너무 길게 잡으면? 타이머가 너무 늦게 알아게됨
- ACK이 들어올때마다 round trip time의 샘플을 구하게 됨 ⇒ 다음번 RTT의 시간을 예측
- 샘플 하나로는 예상하지 못함
- 때문에 평균을 내는데, 이때 재전송된 RTT의 시간은 빼고 구함
- 평균을 이용함에도 불구하고 실제와 차이가 많이남
- EstimatedRTT에 Safety margin을 더함

safety margin을 구하는 식 