TCP와 UDP
데이터를 보내기 위해 사용하는 프로토콜
TCP
연결형 서비스
를 지원하는 프로토콜로 패킷
을 추적 및 관리를 진행
3-way handshaking
과정을 통해 연결을 설정하고 4-way handshaking
을 통해 연결을 해제
- UDP보다 속도는 느리지만
신뢰성
을 보장
- 서버 소켓은 연결만을 담당
- 서버와 클라이언트는
1:1
로 연결
스트림 전송
으로 전송 데이터의 크기가 무제한
- 패킷에 대한
응답
이 필요하기 때문에 성능이 낮음
- 손실된 경우 재전송을 요청하기 때문에 스트리밍 서비스에 적절하지 않음
UDP
비연결형 서비스
로 데이터를 데이터그램
단위로 처리
- 정보를 주고받을때 정보를 보내고 받는다는 신호 절차가 없음
- UDP 헤더의
CheckSum
필드를 통해 최소한의 오류만 검출
- TCP보다 속도가 빠르지만
신뢰성이 낮음
- 신뢰성보다
연속성
이 중요한 스트리밍 서비스에 자주 사용
- 연결이 없어 서버 소켓과 클라이언트 소켓의 구분이 없음
- 소켓 대신
IP
를 기반으로 데이터를 전송
- 서버와 클라이언트가
1:1
, 1:N
, N:M
으로 연결이 가능
- 데이터그램의 크기가 65535 바이트가 초과하면 잘라서 보냄
- 흐름제어가 없어 패킷이 제대로 전송되었는지 확인이 불가
HTTP/1 동작 흐름
- 클라이언트에 웹서버 주소를 입력
- 클라이언트에서 연결할 서버의 도메인 주소를 검색
- 클라이언트에서 소켓을 열고 서버에
TCP 연결
을 시도
- 해당 소켓에 HTTP 요청 메시지를 서버로 전송
- 서버에서 처리하고 HTTP 응답
- TCP 연결 종료
Stream과 Buffer
Stream
- 배열이나 문자열과 같은 데이터 컬렉션으로 자료 입출력에 사용
- 입출력 과정에서
Byte
단위의 데이터들이 자유롭게 움직일 수 있도록 중간 다리 역할
- 입력과 출력을 동시에 처리할 수 없음 (
단방향 통신
)
- 먼저 보낸 데이터를 먼저 받는 FIFO 구조
- 입력 스트림
- 입력 장치로부터 입력을 받고 도착지로 향하는 스트림
- 출력 스트림
- 프로그램을 시작점으로 출력 장치 및 프로그램을 목적지로 하는 스트림
- 시작점
Source
- 입력 Stream
- 출력 Stream
- 종착점 Sink
Buffer
- Stream의 단점을 보완한 입출력의 최종 형태
- 고정값이 아닌 가변적인 값을 받음
- 입력받은 값을 버퍼에 저장해두었다가 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을
한 번에 전송
→ 속도가 빠름
- 스트림에서 버퍼를 사용하지 않는 경우에는 값이 즉시 전달되고, 버퍼를 사용하면 API 호출 횟수를 줄여 성능을 개선할 수 있음
참고자료
https://mangkyu.tistory.com/15
https://coding-factory.tistory.com/614
https://velog.io/@hidaehyunlee/TCP-와-UDP-의-차이
https://terianp.tistory.com/19
https://meetup.toast.com/posts/55