[Web/HTTP] TCP/UDP
OSI 7계층
(참고) https://bbo-blog.tistory.com/81
네트워크 전송 시 데이터 표준을 정리한 것이 OSI 7계층이라면 이 이론을 실제 사용하는 인터넷 표준이 TCP/IP 4계층이라고 할 수 있다.
TCP/IP 4개로 구성
애플리케이션 계층 - HTTP,FTP
전송 계층 - TCP,UDP
인터넷 계층 - IP
네트워크 인터페이스 계층 - LAN 드라이버 , LAN 장비
TCP 특징
- 연결지향 - 3way handshake(가상 연결)
- 데이터 전달 보증 (데이터 전송 시 응답 받음)
- 순서 보장
- 오류 감지(checksum) - 데이터 유실
- 흐름 제어(Flow Control) - 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법
- 혼잡 제어(Congestion Control) - 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법
- 신뢰할 수 있는 프로토콜
흐름 제어(Flow Control)
- 수신측이 송신측보다 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생긴다.
- 수신측에서 제한된 저장용량을 초과한 이후에 도착하는 데이터는 손실 될 수 있으며 손실 될 경우 불필요하게 응답과 데이터 전송이 송/수신 측 간에 빈번이 발생한다. 따라서 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절해야한다.
방법 1 Stop and Wait
- 매번 전송한 패킷에 대해 확인응답을 받아야만 그 다음 패킷을 전송하는 방법
방법 2 Sliding Window
- 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법
- Window : TCP/IP를 사용하는 모든 호스트들은 보내기위한 것과 받기 위한 것 2개의 window를 가지고 있다. 호스트들은 실제 데이터를 보내기 전에 수신컴퓨터의 receive window size에 자신의 send window size를 맞추게 된다.
혼잡제어(Congestion Control)
- 송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리 할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하게되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실이 발생한다. 이러한 네트워크 혼잡을 피하기 위해 송신측에서 보내는 데이터 전송속도를 강제로 줄이게 되는데 이것을 혼잡제어라 한다.
- 흐름제어가 송신측과 수신측 사이의 전송속도문제라면 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서의 전송 문제를 다루게 된다.
- 혼잡제어 알고리즘 1 AIMD(Additive Increase / Multicative Decrease) 합 증가/곱 감소
- 처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기를 1씩 증가 시켜가며 전송하는 방법이다. 만일 패킷전송을 실패하거나 일정 시간을 넘으면 패킷 보내는 속도를 절반으로 줄인다.
- 문제점 : 초기에 높은 대역폭을 사용하지 못하고, 네트워크의 혼잡을 미리감지하지 못하고 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
- 2 SLOW START
- AIMD에 비해 window size를 1씩 늘려주다 한 주기가 지나면 2배로 늘려준다. 대신에 혼잡 현상 발생시 window를 1로 떨어트린다.
- 처음에는 네트워크 수용량을 예상할 수 있는 정보가 없지만 대신 혼잡 현상이 발생하고 나면 네트워크 수용량을 어느 정도 예상할 수 있기 때문에 혼잡 현상이 발생헀던 Window size의 절반까지는 지수 함수꼴로 증가시키고 그 이후부터 1씩 증가시킨다.
- Fast Retransmit(빠른 재전송)
- 패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 해당 ACK 패킷을 보내게 된다. 중복된 ACK 패킷을 3번받게 되면 세그먼트를 전송한다.
- Fast Revocery(빠른 회복)
- 빠른 회복 정책은 혼잡한 상태가 되면 Window size를 1로 줄이지 않고 반으로 줄이고 선형 증가시키는 방법이다. 혼잡 상황을 한번 겪고 나면 순수한 합 증가/곱 감소 방식으로 도착하게 된다.
세그먼트(Segment)
- TCP 프로토콜의 PDU
- TCP는 byte stream을 세그먼트라는 패킷으로 그룹화 한다.
- 송신 TCP에서 TCP헤더를 붙여 세그먼트를 만든 후 IP 계층으로 전달
- 수신 쪽은 헤더를 때고 어플리케이션으로 전달
- 데이터를 내부적으로 자른후 TCP Header+DATA로 자른다 = 세그먼트
TCP패킷 (세그먼트)
- Source Port : 출발지 port, Destination Port : 목적지 port
- 순서 번호(Sequence Number) : 시퀀스 번호를 통해 통신. SYN 플래그가 1로 설정된 경우 초기 시퀀스 번호가 되고 그 후 ACK응답은 +1의 값을 갖게 됨. 이 데이터 번호로 flow control, error control에 사용됨 → 신뢰성 보장
- 확인 번호(ack number) : 상대방으로부터 받아야하는 다음 TCP세그먼트 번호
- 제어 플래그(URG/ACK/PSH/RST/SYN/FIN) : 헤더의 용도 알려줌, 각각 1비트
- checksum - 헤더 및 데이터의 에러 확인을 위해 사용
송신 도중 발생될 수 있는 비트 오류를 검출하기 위해 체크섬 계산알고리즘에 의해 계산한 체크섬을 헤더에 삽입하여 송신, 수신자는 동일 알고리즘으로 수신받은 데이터를 검사해 봄으로 오류여부를 파악
- padding - 32비트에 맞추기 위해 사용되는 비트
- TCP Data : 실제 데이터
3way handshake
- SYN : 접속 요청
- ACK : 요청수락
- 마지막 ACK와 함께 데이터 전송 가능
4-way handshake
- TCP/IP 네트워크 환경에서 서버와 클라이언트의 연결을 해제(세션 종료)하는데 사용하는 프로세스 (논리적인 접속 상태 해제
- 클라이언트에서 서버와의 연결 종료를 위해 서버에 FIN 패킷을 보내고 FIN_WAIT1 상태가 된다.
- 서버는 클라이언트로부터 FIN을 받고 응답 패킷 ACK을 보내며 상태는 CLOSE_WAIT가 된다.
- 서버가 통신이 끝나면, 즉 연결을 종료할 준비가 되면 클라이언트에 FIN패킷을 보내고 LAST_WAIT상태가 된다.
- 클라이언트는 확인 패킷 ACK을 보내고 상태는 TIME_WAIT 상태가 된다.
- 위 과정을 통해 서버와 클라이언트는 안전하게 세션을 종료한다.
UDP 특징
- 연결지향 (3 way- handshake X)
- 데이터 전달 보증 X
- 순서 보장 X
- 단순하고 바름
- IP와 거의 같지만 +PORT + checksum 정도
- 애플리케이션 단에서 추가 작업 필요
정리
TCP는 3way-handshake를 통한 신뢰성있는 연결지향 프로토콜이다. 여기서 말하는 신뢰성이란 데이터가 유실되거나 변질되지 않고 데이터를 보내는 순서또한 보장한다. 데이터의 변질 유무는 checksum을 통해 확인할 수 있고 순서는 sequence number와 acknowledge number을 통해 알 수 있다. 이 외에도 송신자와 수신자의 데이터 처리 속도나 연결된 네트워크의 혼잡도에 따라 데이터가 유실될 수 있는데 이것을 방지하기위해 흐름제어와 혼잡제어를 수행한다. 하지만 TCP는 3way handshake를 통한 논리적인 연결을 수행하기 때문에 전송속도가 UDP에 느린 단점이 있다.
UDP는 TCP와 같은 신뢰성있는 데이터 전송을 보장하진 않지만 전송 속도가 빠르다는 장점이 있다.
온라인 게임, 인터넷 전화, 동영상 스트리밍과 같이 데이터의 정확성보다 전송 속도가 더 중요한 실시간으로 데이터를 송수신할 때에는 UDP를 쓰는 게 적합하다.
'CS > Network' 카테고리의 다른 글
[Web/HTTP] 쿠키 세션 토큰 JWT localstorage (0) | 2021.12.09 |
---|---|
[Web/Network] HTTP 기본 개념 및 HTTP1.0, HTTP1.1, HTTP2.0 특징 (0) | 2021.11.30 |
[Web/HTTP] 인터넷 네트워크 (IP, TCP/UDP, PORT, DNS) (1) | 2021.08.30 |
[Network] OSI 7계층 (0) | 2021.08.30 |