목차
Transport services and protocols
프로세스(실행되는 프로그램)과 프로세스간의 통신
sender 송신자는 애플리케이션 레이어에서 받은 메시지를 세그먼트로 분할하고 네트워크 계층에 전달
receiver 수신자는 받은 세그먼트를 메시지로 재조립하고 애플리케이션 계층에 전달
네트워크 레이어 : host 간의 통신
TCP / UDP
차이점? sender와 receiver 사이의 통신을 할때
- TCP : 양측에서 사전에 통신을 하겠다고 약속을 하고 통신
- UDP : 약속 없이 무작위로 송신
소켓 socket : 버퍼의 역할을 하는 포트를 구별하는 역할, 세그먼트화 된 데이터를 소켓을 통화하여 프로세스에 전달.
Port # : 하나의 PC에서 각 프로세스를 구별하는 방법.
- 16 bit, 0~2^(16-1), 6만5천개
- 프로세스마다 포트를 지정
- 세그먼트의 포트넘버를 구분해서 전송
다중화 Multiplexing 멀티플렉싱 : 여러개의 세그먼트를 동시에 받는 과정. 포트를 구별해주어 동시에 송수신이 일어나도록 함 ⇒ 합치기
역다중화 Demultiplexing 디멀티플렉싱 : 하나의 신호를 여러개의 세그먼트트로 분리하여 보내는 과정 ⇒ 쪼개기
segment format
- source port #
- sender port # 정보를 가지고 있음
- 16 bit
- dest port #
- receiver port # 정보를 가지고 있음
- 16bit
응답시 둘 정보가 교체됨
TCP는 source IP address, dest IP address 포함
example (UDP → dest port #)
TCP = 연결지향형 connection oreiented
소켓 간의 1대1통신. 복잡하지만, 신뢰성이 높음
통신이 실제로 진행되기 전, 송신자가 수신자에게 확인메시지를 날리고, 응답하고, 미리 통신을 약속함 → handshaking
소켓 식별정보 4가지
- source IP address
- source port number
- dest IP address
- dest port number
receiver은 4가지 정보를 가지고 세그먼트를 적절한 소켓에 전송. 포트넘버도 사용해 정확한 프로세스를 식별함
기능
- 혼잡 제어 congestion control : 라우터와 주변 호스트들 사이에 패킷이 많이 몰리면 혼잡도가 크다고 판단, 데이터 size를 줄인다.
- flow control : 패킷이 몰리면서 수신자와 송신자 사이에 속도의 차이가 생기면, 속도를 조절함
example (TCP)
UDP = 연결 없음 Connectionless
하나의 소켓으로 모두 통신
no handshaking, 과정 간단 단순, header 필드 작음(TCP에 비해),신뢰성 다소 떨어짐
과정
- sender : 캡슐화 Encapsulation
- application에서 transport layer가 메시지를 받아서 여러개의 세그먼트로 쪼갬
- 소켓을 통과해 전송계층으로 전달하는 과정 multiplexing
- UDP 헤더를 추가해 세그먼트 만듬
- 네트워크 레이어로 전달, receiver 세그먼트 받으면
- 헤더의 포트# 보고 적절한 프로세스에 전달
- application에서 transport layer가 메시지를 받아서 여러개의 세그먼트로 쪼갬
- reciever : 역캡슐화 Decapsulation
- network 레이어에서 전송된 데이터그램이 헤더를 제거해 세그먼트화
- 세그먼트 내부 헤더의 포트넘버를 보고 소켓을 전송하고
- 소켓을 통해 application 레이어로 전송
- 적당한 소켓으로 전달하는 과정 Demultiplexing
서버 ⇒ 자신의 IP, Port #
클라이언트 ⇒ 자신의 IP, Port # + 서버의 IP, Port # 4개를 다 알아야 서버에게 접근이 가능함
UDP segment format
⭐TCP : Transmission Control Protocol
point to point
- 소켓끼리 ptop ⇒
물리적으로 ptop아님, multicasting 불가능 - src IP, src port, dest IP, dest port
- 한 pc 다른 프로세스 구분 → 소켓이 다르기 때문
- 신뢰성
- 양방향 통신
TCP segment format
헤더의 길이 최소(4줄) 20byte ~ 최대(4줄 + options) ~ 60byte
- src port #(16bit), dest port #(16bit)
- sequence number : 쪼개진 세그먼트 순서 번호 필드, 재조립시 사용, 랜덤숫자 부여, 연속적
- acknowledgement number : 확인용 응답 번호 필드, 시퀀스 넘버 + 데이터길이 누적. 다음 받게 될 시퀀스 넘버
- Flag : 1bit 크기로 세그먼트 연결 상태 파악, 활성화1 없으면0
- 맨앞 빈칸 offset 필드 : head len 길이. option을 포함한 가변 헤더 길이 표현함
- 4bit. 0000~1111 * 4 ⇒ 0~60가지의 숫자
- A : ACK. acknowledgement number 필드가 유효하다. 성공적으로 도착한 데이터에 대한 확인 응답
- R : Reset. TCP 연결을 강제로 초기화
- S : Synchronize. 이 플래그로 sender와 receiver는 sequence number를 동기화함
- F : Finish. 연결의 종료. 연결을 종료하고 싶은 클라이언트가 F 플래그=1 송신하면 받은 서버는 ACK를 반환하고, ack를 잘 받았다는 마지막 메시지를 서버에 전달하면 연결 종료를 확인한다.
- 맨앞 빈칸 offset 필드 : head len 길이. option을 포함한 가변 헤더 길이 표현함
- checksum : 오류검출
- options : 헤더의 가변적 길이. 0~40byte.
3-way handshake : connection-oriented
connection 확인하는 과정. 데이터 교환 전에 송수신자의 상태를 초기화한다.
handshaking 이 완료되면, 데이터를 송수신한다.
lost ACK 발생할 경우 → timeout을 설정해 응답을 일정시간만큼 기다리고, ACK 응답이 오지 않으면, 패킷이 손실되었다고 판단하고 데이터를 재전송한다.
송신자와 수신자 사이에 논리적인 연결을 설정하는 것
- SYN 동기화 단계
- 클라이언트가 서버에 SYN Flag = 1 을 보내 연결을 요청
- 클라이언트의 초기 시퀀스 Seq 번호 x가 포함됨
- SYN-ACK 동기화 확인 단계
- 서버는 SYN 패킷을 받고, 클라이언트에게 SYN Flag = 1과 ACK(확인) Flag = 1을 동시에 보낸다
- 서버의 초기 시퀀스 번호 y, 클라이언트의 시퀀스 번호 x+1, 누적
- ACK 확인 단계 : ACK메시지 잘 받았다고 서버에 알려줌
- 클라이언터는 서버의 SYN-ACK 패킷을 받고, 서버에 ACK Flag = 1 패킷을 보낸다
- 서버의 시퀀스 번호 y+1
Example scenario