- end-to-end 간의 데이터 전송, 논리적인 부분을 담당
- 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 한다.
- TCP (Transmission Control Protocol)
- 프로세스 간에 신뢰적인 연결 지향성 서비스 제공 (웹, 이메일 등) / 양방향 통신
- 전송단위: 세그먼트
- 흐름제어: 수신 속도보다 송신 속도가 빠를 때, 송신 속도를 조절함
- 오류제어: 데이터 전송 중 손실, 손실시 재전송하여 복구
- 순서제어: 쪼개진 세그먼트의 순서를 보장한다.
- 연결지향적: UDP와 반대로, 양 프로세스 간 연결이 HandShaking이 선행된 후 전송된다.
- 송신측이 수신측에 SYN(연결 요청) 전송
- 수신측이 송신측에 SYN + ACK 전송
- 송신측이 수신측에 ACK 전송
- 통신을 끊을 때도 FIN(종료 요청)을 보내 handshaking한다.
- UDP
- 별도의 handshaking이 필요 없는 비 연결형이며, 신뢰성이 비교적 낮다. (DNS, 영상 스트리밍 등)
- 전송단위: 데이터그램
- 작은 헤더 크기: TCP 대비 헤더 크기가 작다. (20 vs 8)
- 체크섬: 체크섬으로 오류 검출을 하여 최소한의 신뢰성을 유지한다. 재전송은 하지 않는다.
- 데이터그램의 순서를 보장하지 않는다.
- end-to-end 간의 데이터 전송, 논리적인 부분을 담당한다.
- 대표적으로 TCP / UDP가 있으며, 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 한다.
Multiplexing, Demultiplexing
Multiplexing, Demultiplexing은 세그먼트 및 데이터그램 헤더 필드 값에 기반한다.
- UDP : 목적지 포트 번호를 사용한 demultiplexing만 수행
- TCP : 소스 및 목적지 IP주소 및 포트 번호를 사용한 4-Tuple을 이용하여 demultiplexing 수행. multiplexing 및 demultiplexing은 모든 계층에서 발생
RDT(Reliable Data Transfer)
신뢰성 있는 데이터 교환. 데이터가 오류나 누락없이 전송되는 것.
RDT 1.0
RDT1.0은 전송과정이 완벽해서 에러나 유실이 되지 않는다고 생각
- 송신
- 상위 레이어에서 데이터가 들어오면 rdt_send(data) 호출
- make_pkt(data)로 패킷 만듦
- udt_send(packet) 호출 패킷 전송
- 수신
- 하위 레이어에서 데이터를 받아오면 rdt_rcv(packet) 호출
- extract(packet, data) 호출로 패킷에서 데이터 추출
- deliver_data(data) 호출해서 상위 레이어로 데이터 전송
RDT 2.0
유실은 안 되지만 error가 발생할 수 있음
- 에러에 대한 detection과 피드백이 존재.
- 받은 데이터에 대한 피드백을 함
- 2.0은 치명적인 결함이 있음
- 수신측에서 보낸 피드백이 에러가 발생하거나 손실되었을 때, 송신측에선 NAK이라는 가정하에 다시 데이터를 재전송한다. 하지만 수신측에선 이게 다시 보낸건지 다음 순서의 데이터를 보낸건지 확인이 불가능함.
RDT 2.1
- RDT 2.0의 치명적인 결함을 제거
- 패킷마다 시퀀스 번호(0, 1)을 붙여 송수신함
- 0번 패킷을 보내고, 0 ACK or 0 NAK 피드백을 기다림
- 정상적으로 잘 받아서 0 ACK를 받았다면, 1번 패킷 전송
- 0 NAK이나 에러가 생겼다면 , 0번 패킷 재전송
- 수신측에서 만약 이미 받았던 데이터인데 다시 받게 되는 경우라면 기존 데이터를 지우고 다시 받은 후 0 ACK로 잘 받았다고 다시 전송
RDT 2.2
위의 버전에서 NAK 없이 ACK로만 구현
에러가 있든 없든 ack로 보내는데 에러가 있으면 시퀀스번호를 다른 번호로 보냄(에러라는 표시
RDT 3.0
데이터가 에러가 발생할 수도 있고 유실도 될 수 있는 상황
위의 RDT에서 필요했던 detection, feedback, sequence number에다가 timer가 추가됨
데이터를 보내고 일정시간(timer) 내에 피드백이 안오면 재전송
타이머를 빠르게하면 빠르게 조치할 수 있지만, 자원소모가 많음
타이머 느리면 느리게 조치됨.
pipelined protocols
한꺼번에 보내고, 피드백을 한꺼번에 받아서 처리.
TCP 특성
- point - to - point: tcp는 한쌍의 소켓으로 이루어져있다. 한쌍의 소켓을 위해서만 동작한다.
- reliable, in-order byte stream: 신뢰성1있고, 데이터에 순서가 있다.
- pipelined: 파이프라인 방식. 전송 후 대기 형태가 아닌 데이터를 한꺼번에 많이 보내고, 보낸것들에 대한 응답 또한 한꺼번에 받을 수 있는 방식.
- full duplex data: 각각의 소켓이 send이자 recive 두가지 다 한다. 데이터를 보내고 받고 다 한다.
- connection-oriented: 연결지향
TCP 동작원리
한개의 TCP가 구성이 될때, 각 소켓에 두 개의 SEND Buffer, RCV Buffer 버퍼 생성
SEND Buffer: 전송되어야할 데이터가 쌓이는 버퍼.
RCV Buffer: 다른 소켓에서 전송받아온 데이터가 쌓이는 버퍼( 추후 애플리케이션에 올릴 데이터)